The issue is that the entire Windows support in GHC Is mostly provided through POSIX support.
Windows however isn't a POSIX system, and these APIs were implemented for compatibility and not performance.
This is the reason why any I/O operation on GHC Windows will be significantly slower. This is the same reason why Console I/O is also much slower. Why Unicode support is a bit wonky etc.
GHC Is currently just not using native Windows syscalls, because by large most developers of GHC don't use Windows.
There are other issues (but I won't go in detail on the user list). We are trying to fix this, there are multiple tickets open such as
https://ghc.haskell.org/trac/ghc/ticket/11394 but it's a big task and there are very limited resources so priority is given to things currently broken rather than just slow.