При использовании CIBlockElement::Add и Update нужно в массиве параметров элемента $arFields задавать массив $arFields["RIGHTS"] примерно таким образом:
для добавления прав
$arFields["RIGHTS"] = array();
$arFields["RIGHTS"]['n0'] = array('GROUP_CODE' => 'G1', 'DO_CLEAN' => 'N', 'TASK_ID' => '24');
$arFields["RIGHTS"]['n1'] = array('GROUP_CODE' => 'G123', 'DO_CLEAN' => 'N', 'TASK_ID' => '25');
здесь G1, G123 - 1 и 123 айдишники групп, TASK_ID это уровни доступа из /bitrix/admin/task_admin.php
кроме G123 можно использовать U345 - пользователи, кажется SG123 группы соцсети
для удаления прав
$arFields["RIGHTS"] = array();
$arFields["RIGHTS"]['n0'] = array('GROUP_CODE' => 'G1', 'DO_CLEAN' => 'Y');
$arFields["RIGHTS"]['n1'] = array('GROUP_CODE' => 'G123', 'DO_CLEAN' => 'Y');
Права, заданные в самом инфоблоке или в разделе, указывать необязательно, они наследуются (указывать только если переопределить нужно).
Не знаю, почему это не описано в документации....
Подробности дебажатся, если поставить обработчик на событие добавления/изменения элемента, который пишет в лог массив $arFields, и смотреть его, изменяя права на элемент через стандартную форму в админке.