Remember that ForEach does not return objects to the pipeline where ForEach-Object does.
You can work-around the problem if the ForEach loop is executed within a script block. Although conversion to ForEach-Object is generally easier on the eyes.
Get-Content c:\tmp\GetADAccountInfos\Users.txt | ForEach-Object {
Get-QADUser $_ | Select-Object SamAccountName, Disabled, Description, MemberOf
} | Export-Csv c:\tmp\query.csv
You might still have the same problem with System.String[]. If you do you need to teach PS how to deal with the array. One option is this:
Get-Content c:\tmp\GetADAccountInfos\Users.txt | ForEach-Object {
Get-QADUser $_ | Select-Object SamAccountName, Disabled, Description,
@{n='MemberOf';e={ "$($_.MemberOf)" }}
} | Export-Csv c:\tmp\query.csv
It uses the default Output Field Separator, a space, to join the string array (System.String[]) so you can see the contents. You can override the character used to join by setting a value for the reserved variable $OFS (e.g. $OFS = ";").
HTH
Chris