PS seems to think that the variable named BLOCK is being captured by the irrelevant lambda and inserts a WITH binding.
PS> (ps (loop :for i :from 0 :below 5 :do (let ((block (elt blocks i))) (foo block) (lambda () nil))))
"for (var i = 0; i < 5; i += 1) { with ({ block : null }) { var block = blocks[i]; foo(block); function () { return null; }; }; };"
This doesn't happen if you take out the lambda:
PS> (ps (loop :for i :from 0 :below 5 :do (let ((block (elt blocks i))) (foo block))))
"for (var i = 0; i < 5; i += 1) { var block = blocks[i]; foo(block); };"
... or even if you rename BLOCK to B:
PS> (ps (loop :for i :from 0 :below 5 :do (let ((b (elt blocks i))) (foo b) (lambda () nil))))
"for (var i = 0; i < 5; i += 1) { var b = blocks[i]; foo(b); function () { return null; }; };"
I thought this might be because PS had compiled a different form where BLOCK was indeed captured by closure in a loop and was remembering this inappropriately. But that doesn't seem right because the problem is reproducible on a fresh restart of PS.
Daniel