The way I would solve this is the following:
First, create a new blueprint called Box (or something similar) and populate it with all the variables that you want - index, color, additional components, whatever.
Second, create another blueprint called BoxCoordinator, which would control the spawning, destroying and general bulk actions on Boxes. Additionally it would also hold the index for all Boxes (array of Box references), just for convenience.
Next, to make it more interesting, you could make an interface that would hold all the most used functions for accessing and changing variables from the BoxCoordinator on the Boxes itself.
Examples of such functions would be:
A function that changes the color of a Box with a specific index.
A function that gets all the Boxes that are in a specific color.
A function that gets all the Boxes in the n-th row.
A function that spawns a new Box row.
A function that destroys the n-th column and fills up the empty space with boxes from the n+1-th+ columns
Etc. you get the point.
Furthermore, as the next step, It would also be nice if you properly split the logic between the Box and the BoxCoordinator. What I mean by this is to have all the Box-related functions on the Box blueprint and to have all the functions that perform bulk actions on the BoxCoordinator. For example, you would have a function named ChangeColor on the Box blueprint and ChangeRowColor on the BoxCoordinator blueprint that would iteratively call ChangeColor on all the boxes of the n-th row.
I hope this helps.