The best way to generate random values in multiple threads is to safely split your random generator every time you fork.
In the case of mwc-random, it looks like you will want to do something like
gen' <- initialize =<< (uniformVector gen 32 :: IO (Vector Word32))
forkIO $ ... gen'
... gen
There is no good reason to share RNG state across threads. Just use a separate RNG state for every thread. This is inherently thread-safe and more performant.
If you're forking very frequently, you will want to benchmark the effect of using a more efficient vector type (i.e. Vector.Unboxed instead of Vector) or fewer elements during initialization.