I am not sure you can do that via the app, because Pointers only really work with static _id's. Because you have many _id's in both Collection B and C, you would need to do this in server Code and create a new object and then pass it to the app.
To save calls, you could add a pointer from Collection B that points to Collection A, and then make another call to collect all rows in Collection C with a 'WHERE' clause that equals the user_id. In this case, you would call all messages with a user_id, and within each result would hold another object, providing you include it, that has the users info.
Then with a simple FOR statement, push them together and send it to the app in one go.
You could also do all the sorting via server code, so the device has less to do, but print the result.