O que você está perdendo é que set -e
e sigspec ERR
se aplicam ao comando execução (comandos que saem com um valor diferente de zero). O que você tem aqui com b=$((h+))
é um erro parsing . O comando não é executado porque não é entendido.
Por que funciona em uma função ou sub-shell? Como esse erro de análise faz com que o script que contém (seja a função ou um sub-shell) falhe como um todo. Em outras palavras, isso não é b=$((h+))
que aciona sua armadilha (não há nenhuma armadilha em suas sub-cascas), esta é a falha da chamada para junk
ou para a sua sub-casca.