lifetime annotations on &mut are intentionally completely inflexible (AKA "invariant"). They have to always exactly mean the whole lifetime of the thing that has been borrowed.
But it's logically impossible that the outer &mut borrow has been created exactly at the same moment as a reference inside G2d<'a> was.G2d had to be created first, and only then could have been borrowed. So in the expression &'a mut G2d<'a> these both 'a lifetimes can't possibly mean they borrow the same thing.
Use two different lifetimes, because borrow of G2d itself as a whole is borrowing a different thing than the 'a that refers to some other data borrowed inside of G2d.
With shared references when you write &'a Something<'a>, the compiler can ignore the paradox, because it's safe to pretend lifetimes of immutable are shorter than they are, so the compiler quietly makes it work. With mutable references it has to be strict to avoid creating loopholes.