Вы хотите чего-то странного. У вас есть регионы, к региону привязано несколько городов (если бы город был один, то не было бы дублей). Что вы в таком случае хотите видеть в data-city для каждого региона?
Я понимаю, когда делают наоборот: выводят города и для каждого ещё сохраняют его регион, чтобы потом как-то эти данные обрабатывать. А вот какой сценарий у вас мне совершенно непонятно.
Предположим, туда нужно передать все города региона. Тогда код будет таким:
$locations = [];
$arSelect = Array("ID", "IBLOCK_ID", "NAME", "PREVIEW_TEXT", "PREVIEW_PICTURE", "PROPERTY_*");
$arFilter = Array("IBLOCK_ID"=>1);
$res = CIBlockElement::GetList(Array(), $arFilter, $arSelect);
while ($ob = $res->GetNextElement()) {
$arProps = $ob->GetProperties();
$region = $arProps['REGION']['VALUE'];
$city = $arProps['CITY']['VALUE'];
if (!array_key_exists($region, $locations)) {
$locations[$region] = [];
}
if (!in_array($city, $locations[$region], true)) {
$locations[$region][] = $city;
}
}
<? foreach ($locations as $region => $cities): ?>
<option value="<?=$region?>" data-cities="<?=implode('|', $cities)?>">
<?=$region?>
</option>
<? endforeach; ?>