The difference is that when you call foo, vectoras an argument map, it is evaluated (which in this case means allowing it to be a function object) once and does not need to be resolved again. The same function object is used even after your code exits with-redefs.
bar, , vector map, , vector . , , vector . map , , with-redefs ( , ).
, - (map vector (range 3)) - , . , map foo vector, map bar , - vector .
Clojure.org , . .