What I ended up doing was having a setTimeout just before Xrm.Page.data.save. It appears that something occurs directly after the field change and just before my JavaScript. It might be business rules (but I had them initially deactivated, so there's a chance this is not it).
Either way, what I did to solve my problem is enclose the save function within a short timeout, and then use Xrm.Utility.openEntityForm to "refresh" the whole page since I'd rather not use the unsupported
Mscrm.ReadFormUtilities.openInSameFrame(window._etc, Xrm.Page.data.entity.getId())
Below is the code snippet I used:
setTimeout(function () {
Xrm.Page.data.save().then(
function () {
var id = Xrm.Page.data.entity.getId();
var entityLogicalName = Xrm.Page.data.entity.getEntityName();
Xrm.Utility.openEntityForm(entityLogicalName, id);
},
function () {
alert('Save failed! Please refresh the form.');
});
}, 500);
I get the record's id after the save for newly created records. Having it outside the timeout or before the save causes a new record to open (Save + New essentially).
If there is a more efficient way to go about this, please feel fee to let me know and I will select your answer (if it works) as the correct one.
EDIT:
The below code is actually a better version. The previous code I had did Save and Save&Close, causing Save to occur twice, which messed up some logic of mine for a different project
setTimeout(function () {
var id = Xrm.Page.data.entity.getId();
var entityLogicalName = Xrm.Page.data.entity.getEntityName();
Xrm.Utility.openEntityForm(entityLogicalName, id);
}, 500);
Here, openEntityForm is Saving the record before closing and opening itself up again, the closest I can get to a Save & Refresh.