The iterators are stored in variables that drop at the end of the block, so after the structures
Your iterator potentially has a non-trivial destructor (a Drop implementation)
Where as the Vec iterator (slice::Iter<'_, _>) has a trivial one
So it would be possible for the destructor of your iterator to observe the SvStr after it has dropped. The first line works because the compiler generates the trivial constructors and it knows they don't observe their contents, it just recursively drops them.
As it turns out, the iterator you are returning does not have a non-trivial destructor. However, one of the points of return-position impl Trait (RPIT) is to give the function author the flexibility to change what underlying concrete type is returned in a non-breaking fashion, so long as it implements the trait. But a flip side of that is the compiler must act like you have a Drop implementation, because some future type you return might have one, even though your current one doesn't.
Returning a concrete type with a trivial destructor works. If you want to maintain more flexibility to change in the future without breaking downstream, you could wrap that concrete type in a newtype of your own, implement Iterator for that, and so on.