Thanks for the answer. Upon further research I figured that MSVC guarantees that the read will be fine as long as data is marked as volatile and aligned properly.
volatile is pretty much the worst solution possible, because the meaning of volatile in MSVC is so dramatically different from standard C++. If someone one day compiles that code with another compiler, it will be silently accepted, but it will have undefined behavior at runtime.