AsyncDefaultAdmissionRequestMutator catches NotAllowedException directly, but they are nested in a CompletionException. This is correctly done in the AsyncDefaultAdmissionRequestValidator. As a result you get a 500 response on the HTTP endpoint, instead of a 200 with a AdmissionResponse with a 403 status and the message as root cause.
It's also an inconvenience that the AsyncAdmissionController accepts a Valiator, but not a Mutator and you have to provide the CompletableFuture.supplyAsync() boilerplate code by yourself.