So, is it still true to say, "You wish you could express your business logic with pure functions. But often you can't because the lack of immutability hurts performance in various ways. But ELM creates a 'sandbox' in which you can do so, by letting you write functions which work over time varying streams instead of stateful callbacks."
If not, which parts changed / how would you revise it?
I wouldn't say that it's about performance for Elm. Its virtual-dom has been shown to be wickedly fast with pure code.
It's more that real programs need real effects: you need to send HTTP requests, read from user input, etc. Elm gives you a managed way to deal with those effects, while keeping the program declarative, and making as much of the logic side-effect free as is possible.
If not, which parts changed / how would you revise it?