getElementsByClassName возвращает nodeList, который обновляется при изменениях в dom
Допустим у Вас выделено 3 элемента, их индексы в nodeList 0, 1 и 2
Вы перебираете их циклом
for(var i = 0; i < selected.length; i++)
На первой итерации цикла Вы убираете класс у 0 элемента, при этом он так же исчезает из nodeList, который сформирован по этому классу, 1й элемент становится нулевым, 2й - первым, length становится 2
На второй итерации Вы убираете класс у элемента с индексом 1, который изначально был 2, nodeList опять обновляется
Третьей итерации уже не происходит, так как i == 2, а selected.length == 1, цикл завершается.
Оптимальнее, как в плане производительности, так и в плане правильной логики перебирать nodeList d обратном порядке, так элемент будет удаляться с конца nodeList - что быстрее, а у необработанных элементов останутся прежние индексы
for(var i = selected.length; i--; ){
selected[i].classList.remove('selected');
}