Uma maneira bastante feia mas fácil de conseguir isso seria definir a variável STOP e verificá-la após cada chamada de função:
a ()
{
echo a
b; [[ "$STOP" == 1 ]] && return
a; [[ "$STOP" == 1 ]] && return
}
b ()
{
echo b
c; [[ "$STOP" == 1 ]] && return
b; [[ "$STOP" == 1 ]] && return
}
c ()
{
echo c
STOP=1; return
}
a
echo d
Não é bonito, mas funciona em bash e zsh.