For the second thing. I'm not sure exactly what your question is. When you borrow value, the compiler creates a lifetime marker to track the relationship between our value, and the reference to it we just created.
The borrow-checker accepts the program if and only if it is possible to pick a region 'a such that:
The value we borrowed from is valid inside the entirety of the region for 'a.
All variables annotated with 'a exist entirely inside the region for 'a.
So the first gives value ≥ 'a, and the second gives 'a ≥ &'a value as well as 'a ≥ MyStruct<'a> and so on.
Be reusing the same lifetime, you require that the references have the same lifetime. However in this case, that is fully general because if you have two different lifetimes, you can just replace that with the intersection of them and it'll work.
The trouble comes when you also return something. These are not the same, and can do different things: