Having two TMap to access the same instances

You really want everything in one container, that is the best practice.
If there is a single clear key such as a GUID “ID” then you can create a TMAP with the GUID as key. When you want the “key” to be present in the data of the value, or when there is no common single key, you put everything in a struct like you did already and collect that struct in a TArray.

Using the structure you provided, To get the element you want you need to filter the TArray by a value within the struct. This can be done with a predicate.

// TArray<FBall> Balls; // Containing data.
const int32 SomeIdentifier = 50;
const FBall* TheBallPtr = Balls.FindByPredicate([SomeIdentifier] (const FBall& BallInArray) { return BallInArray.Identifier == SomeIdentifier }; );

if (TheBallPtr != nullptr) {
  // Do something with it.
  
}

I recently explained how this works in another topic, see post 2 and 3 here:

How Does TArray::ContainsByPredicate Work? - #3 by Roy_Wierer.Seda145