I mean, yes, lifetime elision adds a lifetime to the signature. I don’t see why you need a GAT for for IndexMove.
Mind, I totally misread the OP, and IndexMove is the Wrong Thing. The thing that worries me about an Index-like trait that spits out copies is that &xs[n] is xs.index(n) right now, and in the situation in which you have e.g. IndexCopy, it is not clear if &xs[n] is a reference into xs or a reference to the immediate xs[n]. In this case, &xs[n] is absurd (since, notionally, it’s a reference into Cell), but it sounds to me like OP doesn’t want users to know about the Cells.
Phrased differently: I don’t think a type should have xs[n] (like Vec<impl Copy>, which simply copies out of the returned pointer) but not have &xs[n] (i.e., a notional pointer into xs which xs[n] can be copied out of).