I still don't quite understand why v needs to be initialized. For example, the following definition seems to work fine:
(mac for (v init max . body) (w/uniq gm `(let ,gm (+ ,max 1) (loop (set ,v ,init) (< ,v ,gm) (set ,v (+ ,v 1)) ,@body))))
-----