I see the implementation of lazy zip here. But maybe by ruby you mean some other language.
https://ruby-doc.org/core-2.7.0/Enumerator/Lazy.html
Point is simply: No language is special or exceptional. If a language has yield, you can invert to your hearth's content. Even with lambdas/blocks you can invert by calling it in your loop. Speed is left to the efficiency of your jit or typed compilation. For example SBCL is able to compile incrementally by specifying types.
Adding to this: using laziness compared to a while loop in cases where you will process the whole array is just pure overhead.
Heck, testing now on 3.4.4 a while loop is faster than using each. Summing a million numbers (to make the overhead of the different approaches as clear as possible) shows that a while loop is almost 2x faster.
This is what my complaint is about. Why is the fast path so painful to use in so many languages?
Laziness is not free. An eager loop will be faster than a lazy construct, especially languages where the laziness isn't really a first class construct. Like ruby.
Rewriting the code you wrote (or was it the other guy? I am making food so I cant really check) to avoid intermediate collections as a for loop will be faster, especially if you can avoid creating those array pairs.
I am not saying ruby stinks. I am saying it - and just about every other language - is making it unnecessarily hard to write fast code.