Acabei de corrigir quase exatamente a mesma situação. Espero que ainda ajude você, se não, então talvez outros. Eu comecei a partir do su, não do sudo, mas como o sudo tem a intenção de envolver um único outro comando, ele realmente deveria retransmitir o código de saída do su. Se não, você pode aplicar a correção abaixo no nível de sudo também.
Como você observou, o problema principal é que o su executa com êxito o comando. A ação padrão é relatar que ela foi concluída sem problemas e, portanto, retorna o código de saída 0. Ele não "sabe" que um código de saída não 0 de um comando foi inesperado ou que deve fazer alguma coisa com ele. Assim, a solução é simplesmente fazer su retornar o código de saída do último comando. Isso fez isso por mim
su <user_x> -c '<bunch_of_commands>; exit $?'
Caso o sudo não seja legal, o comando inteiro 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$?'
Cuidado com o aninhamento de cotações e certifique-se de que $? não é expandido, por isso não há aspas duplas.