Technically, you need to always consume the body of the response, or call bodyToMono(Void.class) if you don't expect or don't care for any content that may be in the response. This is explained in the Javadoc of ClientResponse and the exchange() method, and is also mentioned in the reference. It is not explicitly mentioned on the retrieve() method because then you have to choose a bodyToXxx method, but that's not the case if using the onStatus hook as you have found out.
In short technically this is not a bug, since the application is generally expected to consume the body. However unlike the case with exchange() where the application gets the response and the framework does not have a good place to ensure the response is consumed or released, in the case of the onStatus hook, we can do that after the error function is applied. So I'm turning this into an improvement. Meanwhile please use clientResponse.bodyToMono(Void.class).then(Mono.error(new RuntimeException(...))).