Como file in $( echo $file | md5 ) não será interpretado, você precisa de uma solução alternativa.
Uma possibilidade é simplesmente canalizá-lo em um loop while e ler cada saída - nesse caso, melhor ignorar xargs como um todo
find ... | while read file ; do cp "$file" "datnew/$( echo "$file" | md5 )" ; done
Para usá-lo com -print0 , substitua o caractere nulo por uma nova linha usando tr
find ... -print0 | tr 'find ... | while read file ; do cp "$file" "datnew/$( echo "$file" | md5 )" ; done
0\' '\n' | while read ; do ... ; done