One of the major intended uses for Template Haskell is building in constants from external resources, like large text values from files or build information (version, time, environment). Obviously, doing that requires system access.
Then it comes down to try to build a safe API for this, or just allow arbitrary IO. The latter was chosen out of how simple it is, and how easy it is to get a safe API wrong.