This may be by design, I'm not sure. However I did notify the engineering team of this behavior when an existing contact is used to fire an event. Currently the DE fields are only populated when firing an event with a new contact.
When using a new contact to fire an event, you can pull DE data into your email like:
This can also be used for existing contacts, but the DE field will already need to be populated before the event is fired.
Update: I'm told this is functioning as designed. A workaround would be to use the API in your custom trigger or activity to update the DE before the email is sent.
Update2: Two scenarios, 1: the event is fired with a new contact. In this scenario a DE row will be created and fields will be populated with values sent in the payload:
In this scenario, assuming there is a FirstName field on the DE, FirstName will be populated with 'Dan'. The email will be sent with 'Dan' as the FirstName value. Use the lookup() function to pull it into the email.
Scenario 2: A row with Dan's email address already exists in subscribers and the DE. In this case, FirstName in the payload will be ignored. The email is sent and whatever value was in the FirstName DE field will remain, even though a value was included in the payload.