Consider that the version which does not work would, if it did work, return a closure which could escape into the wild and get called from wherever, setting your unsynchronized local and messing things up terribly.
If you insist on doing this sort of thing, you can always create an interface with a setter for your mutable field, implement it in your type and call the setter wherever you need to set this field.
Direct mutation ((set! (.-x foo) ...)
) won't work, since mutable fields of Clojure types (both unsynchronized and volatile) are private.