Salesforce support told me (in Case 14051137) the following:
The framework that sends email notifications when unhandled exceptions
occur implements a complex suppression logic to avoid being too noisy.
In a nutshell its logic is explained at
https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_exception_definition.htm.
However the note on async jobs is incorrect, as same behaviour is
experienced in both sync and async jobs. Basically notification of
unhandled exceptions is handled by the gack framework that implements
a complex suppression logic, and makes receiving these
non-deterministic. Best approach is to implement try and catch that
will cover all "catchable" events (it will not include the
"uncatchable" ones such as hitting governor limits or internal server
errors)
Unfortunately the suppression logic uses rate limits and cache that
make email notification non-deterministic from a developer's point of
view, but the decision to suppress notification is always performed
according to its logic.
Also as per the internal discussion, it was suggested internally that
this framework should be replaced with a different mechanism that
could stream all the errors and persist them into a repository.
Unfortunately, there is no ETA for the same as of now for the same.
As a next step we would encourage you to support the same by raising
an IDEA at our portal for "enhanced exception notification without
any suppression". So that we can get this implemented accordingly.
Please vote for the Idea "Enhanced exception notification without any suppression to package owner" that I submitted as a follow-up.