There is nothing wrong with putting all the data aquisition code in one loop as long as you think the number of data acquisition cards will remain the same. Is the 20 Hz clock external driving all of them, or is each using an internal clock?
If the number of cards may change, you might want to keep them separate just to make it easier to scale up or down.
If you want to have separate loops for each, you can use the Rendevous functions to confirm each card has acquired a point before reading them with local variables in the UDP loop.
You could also create a queue for each card and enqueue a point as it is received. You could put all of the dequeues in the UDP loop so that once all of them have dequeued a point, you can process and send them off. This suggestion will be more reliable if each card is running on its own 20 Hz clock. Either will work if you are using a single external 20 Hz clock for all cards.