Due to lifetime inference rules, unspecified return lifetimes get the same annotation as self if self is a reference. So the fully desugared return types are &'b Bar<'b> and &'b mut Bar<'b>. However, the following can't work:
because – as the compiler very clearly points it out – &mut self.bar is a &'b mut Bar<'a>, and not a &'b mut Bar<'b>. This would be fine if the reference were immutable, since immutable references only allow reading, so if 'b outlives 'a, then everything is fine.
But mutable references also allow writing through themselves, so the dataflow must be considered bidirectional. This manifests in mutable references being invariant: it is not soundly possible to convert a &'_ mut T<'long> to a &'_ mut T<'short>, because the latter would allow the other side to write a T<'short> into the place pointed by &'_ mut T<'long>, which could potentially result in a use-after-free.