You can use &mut I in for loops, because of this:
impl<'_, I> Iterator for &'_ mut I where
I: Iterator + ?Sized,
However, the for loop holds that borrow throughout the loop, which is why you can’t continue using the iterator elsewhere. Using a while let loop only borrows the iterator each time that expression is evaluated.