Of course you can have only immutable data, you just need suitable monads.
You need mutation or garbage collection (and systems programming is the kind of environment where that's not just "someone else's problem").
The point of this article is to detail needs for those monads to interact in a concurrent manner.