We are not against state, quite the opposite, FP likes state so much that we put it on a pedestal! We make it explicit, often with functionality that makes it easy to spot, understand, and manipulate.
If you think about your questions, here is how I would answer it:
"It's harder to test" -- so let's make them simple to test without mocking them out (which would effectively remove them from the test).
"It's harder to reason about" -- so let's make it easy to reason about by making it explicit.
"It's hard to tell where changes come from" -- so let's add constructs for manipulating it.
It is not about antagonizing it, it is about making sure it is clear and intentional.
---
PS: the "evil bit" is more often associated to global mutable state, but don't let any FP language fool you, they all have global mutable state with explicit tools for manipulating them. In Elixir, you can even use tools such as LiveDashboard [1] to navigate all global mutable state in your application, making it very easy to introspect.
[1]: https://github.com/phoenixframework/phoenix_live_dashboard/