I don't know about performance...mostly because I very rarely use subreports, which cause another hit to the database, so 10 records in the main report and 2 subreports will result in 21 hits/trips to the database.
Unfortunately/fortunately, even when I do use a subreport, it is not an additional hit as the datasource I use is ADO.net, and all the information would be contained in a disconnected recordset, so it tends to be faster as all of the data is already there in the report's memory.
Last thought, I don't think that there is another way to do what you want done, as you using this transform a multiple rows in the database into multiple columns....well when it is said that way...have you tried a cross tabs type report, which pivots the data (Reporting Services calls it a matrix, Excel I think calls it a pivot table) That might be faster and easier to maintain that a whole bunch of functions/variables. I tend to use lots of formulas/variables as I am conditionally summing/suppressing values that I then want to apply aggregate functions to, so I have to do them myself.
HTH