You are (willfully) introducing a syntax error in the context of set -e and a trap. You identify a behavior that seems unexpected regarding these. But I do not think the issue has to do with either the trap or the shell option.
Try this (not in your script, just in an interactive shell) :
echo $(( H+ )) && echo OK || echo NOT_OK
This will fail, of course (try echo $? right after). But it will not echo "NOT_OK", it will echo nothing at all, which does not seem natural at all.
Therefore, in the presence of a syntax error, the normal shell semantics break down. You cannot assume that failure by syntax error behaves like a command returning a non-zero status, it clearly bypasses some parts of the expected shell error-handling behavior we are used to.
One more thing... This is a syntax error in the arithmetic expression, but is not detected when the script is parsed. It does not prevent the script from being executed (contrary to missing quotes, brackets...).
This does the same thing :
[[ A = ]] && echo OK || echo NOT_OK
But this does not (will display NOT_OK) :
[ A = ] && echo OK || echo NOT_OK
Double-bracketed conditionals are reserved words, while single-bracketed conditionals are shell builtins, so that may have to do with the difference in behavior.
ERRtrap andset -eare not here for syntax errors.EXITsignal0. (Unless you also useset -u, of course).