you can try this.
I execute 1 awk per source file. Put content in temporary file (in each process it is a series of different one to avoid conflict in same final file and/or too much open/close handle on it). At the end of the awk, it put the content of temporary file into final one and remove temporary
you maybe have to use a batch limiter (a sleep or more smart grouping) if there are lot of file to treat to avoid to kill the machine with too much subprocess concurrent.
rm output/*.csv
for File in mydir/*.csv
 do
   # shell sub process
   {
   # ref for a series of temporary file
   FileRef="${File##*/}"
   awk -F ',' -v FR="${FileRef}" '
      NF == 29 {
         # put info in temporary file
         ListFiles [ OutTemp = "output/"$2".csv_" FR ] = "output/"$2".csv"
         print > OutTemp}
      END {
        # put temporary content into final file
        for ( TempFile in ListFiles ) {
           Command = sprintf( "cat \042%s\042 >> \042%s\042; rm \042%s\042" \
              , TempFile, ListFiles[TempFile], TempFile )
           printf "" | Command
           }
      ' File
    } &
 done
wait
echo ls -l output/*.csv