With dynamic transactional templates, the subject property of the send request is ignored; the subject comes from the template's own subject field. Fix: in the SendGrid template editor, set the subject line to {{subject}}, then pass the subject inside dynamic_template_data:
const msg = {
to: 'an email address',
from: 'an email address',
templateId: 'd-xxx',
dynamic_template_data: { test_name: 'Testing Name', subject: 'Hello World' },
};
Multiple reporters confirmed this solves it. Source: https://github.com/sendgrid/sendgrid-nodejs/issues/843
Source: https://github.com/sendgrid/sendgrid-nodejs/issues/843