This is done now. Using your example:
arc> (js `(= this!x 10)) (function(){return this.x=10;}).call(this);nil
(js-mac do args `(((fn () ,@args) 'call) this)) ; used to be ;(js-mac do args ; `((fn () ,@args)))
(= js-macs* (table)) (mac js-mac (name args . body) `(= (js-macs* ',name) (fn ,args (js1 ,@body))))
(js-mac with (parms . body) `((fn ,(map1 car (pair parms)) ,@body) ,@(map1 cadr (pair parms))))
arc> (js `(with (x 1 y 2) (+ x y))) (function(x,y){return (x+y);})(1,2);
(js-mac with (parms . body) `(((fn ,(map1 car (pair parms)) ,@body) 'call) this ,@(map1 cadr (pair parms))))
arc> (js `(with (x 1 y 2) (+ x y))) (function(x,y){return (x+y);}).call(this,1,2);