As I see it, selecting the new copied parts is part of a transaction, or should be within a transaction. Therefor deselecting the new parts, removing the parts and selecting the original parts should be within an undo.
Otherwise the following happens:
// update the Angular model when the Diagram.selection changes
diagram.addDiagramListener("ChangedSelection", function(e) {
diagram.model.selectedNodeData = null;
console.log("selected count: " + diagram.selection.count);
var it = diagram.selection.iterator;
while (it.next()) {
var selnode = it.value;
// ignore a selected link or a deleted node
if (selnode instanceof go.Node && selnode.data !== null) {
diagram.model.selectedNodeData = selnode.data;
break;
}
}
scope.$apply();
});
CTRL-A: selected count: 9, key=1 selected
drag copy: new parts are copied, selected count: 9, key=-1 selected (selecting the new parts should be in the transaction, also deselecting the original parts should be in the transaction)
CTRL-Z: selected count: 9, no node selected, as we iterate over the deleted parts (in my eyes wrong, when we reverse the previous transaction: deselect new parts, remove them, select the original parts)
CTRL-A: selected count: 18, key=1 selected
drag copy: new parts are copied, selected count: 13, key=-5 selected
CTRL-Z: selected count: 13, no node selected
CTRL-A: selected count: 22, key=1 selected
drag copy: new parts are copied, selected count: 13, key=-5 selected, by now I see artifacts on the diagram. (In my implementation resulting in some binding problems.)

In my eyes, keeping the deleted non-existing nodes selected makes no applicatory sense. When someone would need the information he has to programmaticaly save the parts on the change select event. So after a CTRL-Z he can act on them. For the “normal” programs to code around this in my eyes “misbehaviour” is cumbersome and someone needs to now the goJS internals.
Also, now the user looses his selection after an undo and might need to tediously shift-click, control-click again.
That the de-selecting of the old and re-selecting of the original parts should be part of the transaction is easily shown how Word behaves:
Write some characters, select a part of the written text, CTRL-C, CTRL-V, CTRL-V, CTRL-Y, CTRL-Y, the in the beginning selected parts are re-selected again.
As a quick win, due to the fact re-selecting the original nodes is not part of a reverse-transaction during an undo, the Diagram.ClearSelection could be called at the end of an undo.