Эта строка:
containerDOMElement.innerHTML += html;
Имеет ту же функциональность, что и эта строка:
containerDOMElement.innerHTML = containerDOMElement.innerHTML + html;
По-другому вы можетевидим, что весь HTML перестраивается, таким образом теряя выбранные в данный момент параметры.
Вместо этого, чтобы добавить HTML, мы можем использовать insertAdjacentHTML .В вашем случае:
containerEl.insertAdjacentHTML('beforeend', html);
Вот рабочая версия вашего JSFiddle:
let existing_options = [
"A","B","C"
];
let containerEl = document.getElementById("container");
let count = 0;
function addSelect(preselectOptionB=false) {
html = `<select class="selector" name=${count}><option value="">No value selected</option>`;
existing_options.forEach(function (dataValue,index)
{
html += `<option value=${dataValue} ${(preselectOptionB && dataValue=="B") ? 'selected="selected"' : ""}>${dataValue}</option>`;
});
html += `</select><br/>`;
count++;
containerEl.insertAdjacentHTML('beforeend', html);
}
function addNewSelectWithNoValue() {
addSelect(false);
}
let button = document.getElementById("addbutton");
button.addEventListener('click', addNewSelectWithNoValue);
// add four initial ones.
addSelect();
addSelect(true);
addSelect();
addSelect(true);
<div id="container"></div>
<hr/>
<button id="addbutton">Add another</button>