The problem is that the caller of save() (the grid code) is not waiting for the promise to resolve before it continues on and commits the change as it has no idea your save handler is a promise.
I don't really have a solution other than I would try to preventDefault() immediately and then in confirm handler, update the model and in the else case do nothing.
As for not being able to modify the value:
1. The syntax for set() is model.set('FieldName', newValue) NOT model.set('FieldName') = newValue.
2. Also, the new value is in the e.values property and has not yet been written to the model. If you allow the save to commit, e.values.YourField will get written to e.model.YourField by the framework.
When you do e.model.set('KeyCode', value) the caller of save() will most likely overwrite it with the value in e.values.
You may have to try setting e.values.KeyCode = newValue instead.