Your second example seems to work fine for me (in both AngularJS and plain JavaScript version).
Just a couple of comments:
1. As you have noticed already, dataTagFields is not used in the JavaScript version.
2. Typically, the database id is stored in "id" property of the source event object. That property is required - it is used to find and compare events. See also https://api.daypilot.org/daypilot-event-data/
3. If you are modifying args.e.data you don't need to call dp.events.update(args.e) - unless you want to redraw the event. The "data" object holds a reference to the original source object (from dp.events.list). So any change made to args.e.data will have an immediate effect. The calendar component only modifies the following fields (if necessary): start, end, resource. Other properties remain untouched.
4. You can also define custom properties directly on the source data object (instead of data.tags). Just make sure it doesn't interfere with the internal properties. Using data.tags makes that easier as "tags" is reserved for this purpose.
5. The data object will get replaced only if you reload the data (dp.events.list in JavaScript, "events" attribute in AngularJS).
Let me know if it still doesn't work.