I finally got it. The problem was around the DataView. I was updating it all on any change (and sometimes more often even). I built a computed observable in the ViewModel to recalculate it :
var cachedFilterCount = 0;
var dataViewUpdater = ko.computed(function () {
var cachedCount = cachedFilterCount, actualCount = viewModel.filteredEmployeeList().length;
if (cachedCount !== actualCount) {
cachedFilterCount = actualCount;
dataView.setItems(ko.toJS(viewModel.filteredEmployeeList), "EmployeeId");
} else if (viewModel.vmHasChanges()) {
_.any(filteredEmployeeList(), function (item) {
if (item.hasChanges()) {
dataView.updateItem(item.EmployeeId(), ko.toJS(item));
}
});
}
});
Instead of previously doing a full dataView.setItems on any change in my base list. With that fine-grained update to the grid data, it works quick enough, and is recalculated at the right times.
Thanks again to all who pitched in.