Обратите внимание, что в цикле while вы используете CIBlockElement::GetByID. Это крайне неоптимальный код, т.к. вы делаете кучу запросов к БД.
Вместо этого будет лучше в цикле while собрать интересующие вас ID элементов. И затем выполнить один запрос CIBlockElement::GetList с фильтром по ID.