How can I copy data from an external HDD that is about to fail?
I would try using rsync from the command line. 

rsync -av --ignore-errors /Volumes/failingDrive/ /Volumes/brandNewDrive


should do the trick. Mind the trailing / at the end of the source. Rsync will not copy files it finds on the destination, so if you call it a second time it will continue where it left off.