Found this bug in 5.4-beta-22. I've confirmed that the bug was not present in 5.4-beta-6.
When an error is recorded with Form.recordError(Field field, String errorMessage) or ValidationTracker.recordError(Field field, String errorMessage) it normally is shown in the UI by decorating the field in error and displaying the errorMessage below it.
In 5.4-beta-6 and every release ever before that, that was the behaviour regardless of whether the request is non-AJAX or AJAX.
In 5.4-beta-22, the behaviour changes when the request is AJAX: the field does not display an error. That is, the field is not decorated and the errorMessage is not shown with it. If your Errors component has globalOnly="true", which is the norm these days, then you won't even see the error message there! If you set globalOnly="false" then the message is shown, but who would want to set globalOnly="false"???
Comparing the HTTP responses of beta-22 with beta-6, I see that beta-6 had an extra entry in the inits, like this:
["t5/core/fields:showValidationError", "firstName_8cf3108fe0ece9", "First Name must not be Acme."]