Você pode fazer isso em dois passes. Primeiro, para substituir vírgulas não citadas:
/(?!\B"[^"]*),(?![^"]*"\B)/\|/gm
Input Output
--------------------------------- ---------------------------------
aaa,bbb,ccc,"ddd,eee","fff,ggg" aaa|bbb|ccc|"ddd,eee"|"fff,ggg"
"aaa,bbb",ccc,ddd,"eee,fff" "aaa,bbb"|ccc|ddd|"eee,fff"
"aaa,bbb","ccc,ddd","eee,fff",ggg "aaa,bbb"|"ccc,ddd"|"eee,fff"|ggg
Aqui está uma demonstração on-line da primeira etapa
Em seguida, uma simples substituição de "por nada fornecerá o resultado final desejado:
/"//gm
Input Output
--------------------------------- ---------------------------------
aaa|bbb|ccc|"ddd,eee"|"fff,ggg" aaa|bbb|ccc|ddd,eee|fff,ggg
"aaa,bbb"|ccc|ddd|"eee,fff" aaa,bbb|ccc|ddd|eee,fff
"aaa,bbb"|"ccc,ddd"|"eee,fff"|ggg aaa,bbb|ccc,ddd|eee,fff|ggg
E aqui está uma demonstração on-line da segunda etapa
Isso se baseia em esta resposta no Stack Overflow .