At a higher level, the signature of the trait...
trait Borrow<T: ?Sized> {
fn borrow(&self) -> &T
}
...implies that there is a T somewhere in *self -- in a field, behind another indirection or such (for the most part). Wrapper(String) contains a str in this sense, but it does not contain a &'a str.
And beyond "containment", note that this attempt...
impl<'a> Borrow<&'a str> for Wrapper {
...means that Wrapper implements Borrow<&'static str>, which means if it compiled, a caller could do this.
fn example(wrapper: Wrapper) {
let r: &&'static str = wrapper.borrow();
let s: &'static str = *r;
drop(wrapper);
println!("{s}");
}
That's clearly unsound if the str data is owned by the Wrapper. So your &'a str implementation which tries to return the contents of the owned String must not be allowed, no matter what the particular errors happen to be.
(The same demonstration can be made with any lifetime, not just 'static. But 'static is probably easier to understand.)
If the above doesn't make sense to you, try to articulate why and I'll try to explain more.
This is a question about a particular error. First, you did annotate the 'a in the signature. You need to return a &'1 &'a str. Instead as @Morgane55440 walked through in more detail, your return expression is a
&'fresh_borrow_of &'1 str
And you can't coerce &&'1 str to &&'a str unless '1: 'a, which is not the case here. That's the first error ("lifetime may not live long enough"). Additionally the &'1 str is a local temporary, and you can't return references to locals. That's the second error ("cannot return reference to temporary value").
So it's not because of 'a: '1, it's because (in part) there is no '1: 'a bound (and because you can't return references to locals -- you contain no &str s to return a reference to).