You are correct, the state map is not multi-thread safe. The semaphore isn't really gone, it's just externalized. The magic is on line 52. In Hubitat 2.2.9, they introduced the singleThreaded attribute for both apps and drivers, which provides externally managed thread exclusion. It is faster than atomicState and designed for just this kind of situation.
[Edit: singleThreaded attribute described here]