Large dataset of 400+ million rows to compare
Isn't contact unique in both tables?  If so, get rid if id and have PRIMARY KEY(contact).  There are multiple reasons why this is likely to speed things up.

active_call and call_status sound like things that are changed often?  That interferes with the setting of the dnc_contact, especially when done in large chunks.

I can think of no good reason to even have dnc_contact in contacts.  It is redundant information.  That is, when you are about to make a call, do the JOIN to verify that the phone number is not in dnc_contact.

If you really need to do the UPDATE, here are tips on how to do it is a relatively non-invasive way -- bu chunking.