I guess I used the wrong terminology, but I think you could treat the array elements as separate "fields" if you wrote a separate formula for each, such as:
{@split1} for the first array element:
Whileprintingrecords;
stringvar array Names := split({table.names},"&"

;
Names [1];
{@split2} for the second array element:
Whileprintingrecords;
stringvar array Names := split({table.names},"&"

;
Names [2];
{@split3} for the third array element:
Whileprintingrecords;
stringvar array Names := split({table.names},"&"

;
Names [3];
But your example suggests that what you need is the ability to examine a string for the presence of a specific element and then record the result in a box. Maybe what you need is the instring function:
if instr({table.names},"Tom"

> 0 then X //formula to place in Box 1
if instr({table.names},"Bill"

> 0 then X//formula for Box 2, etc.
Not sure if this is what you're looking for though.
-LB