(...) não é (principalmente) para os comandos grupo , mas para iniciar uma sub-rede. Portanto, o exit em (echo failed && exit 1) só sai da sub-rede.
Para agrupar comandos sem executá-los em um subshell, você usaria { ...; } :
X='getinfo.sh' || {
echo >&2 "failed"
exit 1
}
Embora aqui, eu prefiro usar:
if ! x=$(getinfo.sh); then
echo >&2 failed
exit 1
fi
Observe também que echo failed && exit 1 pode falhar ao sair se echo falhar, o que pode acontecer quando o stdout for um arquivo em um sistema de arquivos completo ou se um tubo quebrado for ignorado pelo SIGPIPE ou se o stdout tiver sido fechado ou um limite de tamanho de arquivo foi atingido com SIGXFSZ ignorado ...