I have had issues like this with modifySTRef before. Try to make a strict version modifySTRef'
If memory serves, something like this worked for me. modifySTRef' r f = do a <- readSTRef r writeSTRef r $! f a