Have the proposed script check the Discouse database before sending anything. Compare the current visitor email list vs new Discourse users or the entire user database. If there’s an email match, remove the email from the visitor list. Then it can query the database for the relevant posts as usual then tip off MailChimp via their API.
If the script does the above then the second problem won’t happen. A user wouldn’t have their email in two separate systems. They simply remove themselves from the digest via user prefs on Discourse.
Done and done.
EDIT: The ‘mirror check’ can include the last successful newsletter mailing to the current time. It takes the ‘last successful’ time and uses that to query the Discourse user database for emails by checking the registered date. That way there’s no need for the script to read the entire database for emails, but instead pick up relevant new accounts and then search those for duplicate emails (especially if you have enough users to equal a quaint Smalltown, USA).