the way you're doing it is fine
I would use volatile! for that
the mutable cell stuff is there because it predates when clojure introduced volatile!
you could improve your implementation with inline caching by mimicking how specter does it for other operations