My solution requires repeated runs of the script, but it works. First save parent layers via object attribute, and restore on request.

/*
RememberLayers.jsx for Adobe Illustrator
Description:
Saving and restoring selected items to their original layers.
The order within the layers is not restored
Author: Sergey Osokin, email: hi@sergosokin.ru
*/
//@target illustrator
app.preferences.setBooleanPreference('ShowExternalJSXWarning', false); // Fix drag and drop a .jsx file
function main() {
if (!documents.length) return;
if (selection.length == 0 || selection.typename == 'TextRange') return;
var doc = activeDocument,
docSel = selection,
keyPref = 'origLayer=';
// DIALOG
var dialog = new Window('dialog', 'Remember Layers');
dialog.preferredSize.width = 146;
dialog.orientation = 'column';
dialog.alignChildren = ['fill', 'center'];
var saveBtn = dialog.add('button', undefined, 'Save');
var restoreBtn = dialog.add('button', undefined, 'Restore');
var cancel = dialog.add('button', undefined, 'Cancel', {name: 'cancel'});
var copyright = dialog.add('statictext', undefined, '\u00A9 Sergey Osokin');
copyright.justify = 'center';
copyright.enabled = false;
saveBtn.onClick = save;
restoreBtn.onClick = restore;
cancel.onClick = dialog.close;
function save() {
for (var i = 0, len = selection.length; i < len; i++) {
var currItem = selection[i];
removeNote(currItem, keyPref);
currItem.note += keyPref + currItem.layer.name + ';';
}
dialog.close();
}
function restore() {
var regexp = new RegExp(keyPref + '(.+)', 'g')
for (var i = selection.length - 1; i >= 0; i--) {
var currItem = selection[i],
layerName = '';
if (currItem.note.match(keyPref) !== null) {
layerName = currItem.note.split(';')[0].replace(regexp, '$1');
moveToLayer(currItem, layerName);
}
removeNote(currItem, keyPref);
}
dialog.close();
}
dialog.center();
dialog.show();
}
// Remove keyword from Note in Attributes panel
function removeNote(item, key) {
var regexp = new RegExp(key + '(.+);', 'g');
item.note = item.note.replace(regexp, '');
}
// Move selected item to original Layer by name
function moveToLayer(item, name) {
var origLayer;
try {
origLayer = activeDocument.layers.getByName(name);
item.move(origLayer, ElementPlacement.PLACEATBEGINNING);
} catch (e) {}
}
try {
main()
} catch (e) {}