На самом деле, cloneNode не выдает никакой ошибки.Разбейте ваш код на более мелкие куски, чтобы правильно определить источник ошибки:
var origOpt = source.options[i];
var clonedOpt = origOpt.cloneNode( true ); // no error here
var destOptLength = dest.options.length;
dest.options[destOptLength] = clonedOpt; // error!
dest.options.add(clonedOpt); // this errors too!
dest.appendChild(clonedOpt); // but this works!
Или, вернув его так, как он был у вас, в одной строке:
dest.appendChild(source.options[i].cloneNode( true ));