_Comment made by: hiredman_
For some weird reason (maybe as an optimization of some sort?), the or macro in cljs some times expands as calls to if (like clojure's does) and some times expands to `(js* "(~{}) || (~{})" a b)`. the ioc machinery has no special handling for `js*` so it does its normal ANF like transform:
(js* "(~{}) || (~{})" A B)
to
(let [x A
y B]
(js* "(~{}) || (~{})" x y))
so of course you lose short circuiting.
General support in the ioc machinery for js* would require parsing the rewriting the javascript, which seems unlikely to happen. Specific cases of js* could be handled by matching the exact string of javascript, but that may be kind of brittle.
The best thing to do is likely to change the clojurescript definition of or to always emit ifs (like clojure's) and move an optimizations in to the compiler.