You should be aware that the number of permissions returned from each file can be variable, which Powershell doesn't handle very well when combining. You'll end up with the number of columns resulting from the object that is first output from GAM into the $data object. So, if you need those permissions, you should isolate them into their own objects to ensure that you capture all of them from their own files.
Another thing to be aware of is that you need to use a thread safe container to store the results from, otherwise you'll end up losing some data or potentially even some garbled data.
This article provides more information, but essentially you'll want to use something like:
$data = [System.Collections.Concurrent.ConcurrentDictionary[string,object]]::new()
I couldn't get your piece of script to work for me, but usually you also need to use $using:data to be able to use the external variable in the foreach -parallel script.
So, you might try something like (you can replace $tempdata to $data below if you prefer, if that is less confusing or easier to adapt to your current script):
$data = [System.Collections.Concurrent.ConcurrentDictionary[string,object]]::new()
$TargetUsers | ForEach-Object -ThrottleLimit 10 -Parallel {
$tempdata = $using:data
$tempdata.TryAdd($_.primaryemail, (gam user $_.primaryemail print filelist showownedby me fields id,name,owners.emailaddress,mimetype,permissions,quotaBytesUsed,size,webContentLink,webViewLink | ConvertFrom-Csv))
}
After that is finished, you'll be able to access the dictionary $data with the data accessible by email address, such as by $data['
test...@example.com']. You can easily (and safely) export these to separate CSV files. Combining the data into a single object/CSV is tricky. I think one way is to find the object with the most columns, then combine them with that one at the top. I think it is safe enough for something like this, but if any objects contain any properties that that first object has, then they will still be lost.