The async value is set on MvcResult through an interceptor, and that releases perform(asyncDispatch(..)) to proceed. However there is a small window of time after that until the concurrentResult is set, see lines 316 vs 325. If you put a break on line 325 to slow down setting the concurrentResult, the main thread proceeds with the asyncDispatch and then hangs upon entering in the controller method.
It looks like at some point we did have a latch to wait for the dispatch, but that was removed in a follow-up fix. Not really sure how it went undetected for so long. Maybe the window is small enough, or perhaps something about this test that makes it a little more likely to fail.
I've been unable to reproduce the failure on macOS, but our Concourse CI environment (Docker container running on Linux) has been affected reasonably frequently, IIRC. That's the environment in which I captured the thread dump in the referenced Boot issue.