Стала ясна одна штука, я ошибался, когда думал, что не работает только удаление предпоследней строки)
Удаление любой строки происходит криво. Точнее как, функция testKey работает нормально. Ловит нажатия Delete, удаляет нужный элемент массива, заносится в dg.dataProvider. И при дебаге все на своих местах.
Но затем, после любой активации dg, происходит "восстание из мертвых": срока, которая была удалена, появляется и заменяет строку, следующую за ней. Причем и в dataProvider и в aData одновременно.

Добавленно:
Не знаю почему это работает, но придумал следующий фокус:

Код AS3:
private function testKey(e:KeyboardEvent):void {
if (e.keyCode == Keyboard.DELETE) {
dg.dispatchEvent(new MouseEvent(MouseEvent.MOUSE_DOWN)); //!!! отвлекающий маневр
dg.dispatchEvent(new MouseEvent(MouseEvent.MOUSE_UP));//типо ничего и не было)
var index:uint = dg.selectedIndex;
aData.splice(index, 1);
for (var i = index; i < aData.length-1; i++) {
aData[i]["№"] = i + 1;
}
dg.dataProvider = new DataProvider(aData);
}
}
Уф, неужели получилось)