Scratch this question.
I think I've figured out that the "step" function in some people's code is there for aesthetic reasons only. As long as the step function contains the same code as would otherwise go directly inside the (lazy-seq ... ) there's no difference.
That is,
(let [step (fn [a b] <stuff>)]
(lazy-seq (step a b)))
is the same as
(lazy-seq <stuff>)
The lazy documentation on the web site had made me think there was something special about the former, i.e. the compiler was optimizing it in some special way.
Someone please correct me if I'm still confused.