Eu apenas consertei quase exatamente a mesma situação. Espero que ainda ajude você, se não for o caso, talvez outros. Comecei pelo su, não pelo sudo, mas como o sudo pretende envolver um único outro comando, ele realmente deve retransmitir o código de saída do su. Caso contrário, você também pode aplicar a correção abaixo no nível do sudo.
Como você notou, o principal problema é que o comando executa com êxito. A ação padrão é relatar que foi concluída sem problemas e retornar o código de saída 0. Ele não "sabe" que um código de saída diferente de 0 de um comando foi inesperado ou que deve fazer algo com ele. Portanto, a solução é simplesmente fazer su retornar o código de saída do seu último comando. Isso fez por mim
su <user_x> -c '<bunch_of_commands>; exit $?'
Caso o sudo não tenha um bom desempenho, todo o comando deve ser algo assim (eu verificaria isso para você, mas não tenho o sudo instalado)
sudo 'su <user_x> -c \'<bunch_of_commands>; exit $?\'; exit$?'
Preste atenção ao aninhamento de aspas e certifique-se de $? não é expandido, portanto, não há aspas duplas.