Как сделать сложный getList запрос в 1С-Битрикс?
Примерно так, если нужны поля инфоблока:use Bitrix\Main\Application;
use Bitrix\Highloadblock\HighloadBlockTable;
use Bitrix\Main\Loader;

Loader::includeModule('highloadblock');
Loader::includeModule('iblock');

$hlBlockId = 2;

$hlblock = HighloadBlockTable::getById($hlBlockId)->fetch();

/** @var \Bitrix\Main\Entity\Base $entity */
$entity = HighloadBlockTable::compileEntity($hlblock);

/** @var \Bitrix\Main\Entity\DataManager $dataClass */
$dataClass = $entity->getDataClass();

Application::getConnection()->startTracker();

$result = $dataClass::getList([
    'select' => array(
        'UF_ELEMENT_ID',
        'NAME' => 'ELEMENT.NAME',
        'CODE' => 'ELEMENT.CODE',
        'DETAIL_PICTURE' => 'ELEMENT.DETAIL_PICTURE',
    ),
    'runtime' => array(
        'ELEMENT' => array(
            'data_type' => '\Bitrix\Iblock\ElementTable',
            'reference' => array(
                '=this.UF_ELEMENT_ID' => 'ref.ID'
            ),
            'join_type' => 'inner'
        ),
    ),
    'limit' => 10,
]);

// Можно смотреть сформированный запрос
echo '<pre>', $result->getTrackerQuery()->getSql(), '</pre>';

while ($row = $result->fetch()) {
    echo '<pre>';print_r($row);echo '</pre>';
}
Со свойства чуть сложнее.
P.S. некоторые примеры с использованием ORM D7
Запишите данные в массив и потом используйте метод GetList(). Удалите из цикла GetByID(), так не надо делать.while($arElement = $result->fetch()) {
   $arElements[] = $arElement;
}
$res = CIBlockElement::GetList(...