The reason is simply that a null or empty value will not match the expected shape (regexp).
To see the current regular expression used with Validators.email, check out this link:
const EMAIL_REGEXP = /^(?=.{1,254}$)(?=.{1,64}@)[-!#$%&'*+/0-9=?A-Z^_`a-z{|}~]+(\.[-!#$%&'*+/0-9=?A-Z^_`a-z{|}~]+)*@[A-Za-z0-9]([A-Za-z0-9-]{0,61}[A-Za-z0-9])?(\.[A-Za-z0-9]([A-Za-z0-9-]{0,61}[A-Za-z0-9])?)*$/;
console.log(EMAIL_REGEXP.test('')); // false
console.log(EMAIL_REGEXP.test(null)); // false
console.log(EMAIL_REGEXP.test('<a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="f796b796d994989a">[email protected]</a>')); // true
If you want to achieve this functionality, you can either create a custom validator that accepts this Regexp or a null/empty value, or consider using an async validator like I would in this case. Check out more information on creating asynchronous validators here.