I guess my confusion is why this requirement is imposed in the context of a let expression? It cannot be the case that let expressions must be updating in the context of an updating function.
True, there are different checks: The inner check isn't aware of the let context, it merely matches the (non)updating statuses of try and catch. The outer check ensures that the expression defined in the let clause is not updating.
You can disable the strict W3 XQUF semantics by enabling the BaseX-specific MIXUPDATES option.