It's really historical, and not that important if all you're going to do is clone one disk to another.
On traditional Unix, disks were accessible through both block devices and character devices, and each had different requirements. 'dd' was needed to interact with the block devices, because 'cat' only knew about character I/O. (Block I/O was particularly important for dealing efficiently with things like tape drives.)
dd can be handy if you need to re-start a long-running copy, because of its skip and seek options.
Unless you're on a system that still has the block/character distinction for disk access (which Linux doesn't), and unless you need to do something like swap bytes, 'cat' will be fine (and probably faster, because it'll default to huger block sizes than dd).
Note that, unless someone's done some major tinkering in shell design since last I looked, 'cat foo >bar' does not do the writing to 'bar' via the shell; all the shell does is open 'bar' for writing with truncation, then pass the open file descriptor to 'cat' across a fork/exec as file descriptor 1 (stdout). At that point, the shell is out of the loop, and doesn't get involved again, beyond being notified of the exit status of 'cat'.