Попробуйте такое
$eventManager = \Bitrix\Main\EventManager::getInstance();
$eventManager->addEventHandler('sale', 'OnSaleOrderBeforeSaved', 'orderModify');
function orderModify(Bitrix\Main\Event $event)
{
    global $USER;
    /** @var \Bitrix\Sale\Order $order */
    $order = $event->getParameter('ENTITY');
    $personTypeId = 3;
    $profileId = CSaleOrderUserProps::DoSaveUserProfile($USER->GetID(), null, 'Профиль ' . random_int(0, 500), $personTypeId,
        // код свойства и его значение
        [
            20 => random_int(100, 900),
            21 => random_int(500, 599)
        ], $errors);
    // Получаем текущую коллекцию свойств заказа и удаляем все свойства
    /** @var \Bitrix\Sale\PropertyValueCollection $orderProperties */
    $orderProperties = $order->getPropertyCollection();
    /** @var \Bitrix\Sale\PropertyValue $orderProperty */
    foreach ($orderProperties as $orderProperty) {
        $orderProperty->delete();
    }
    // Меняем тип плательщика
    $order->setPersonTypeId($personTypeId);
    // Далее взято из \Bitrix\Sale\PropertyValueCollection::load()
    // Т.к. на объекте заказа уже была получена коллекция, то при вызове $order->getPropertyCollection(),
    // коллекция не будет заполнена свойствами под новый тип плательщика.
    // Поэтому нужно добавлять свойства вручную
    // Получаем список свойств нового плательщика
    $props = \Bitrix\Sale\PropertyValue::loadForOrder($order);
    // Добавляем свойства к коллекции
    /** @var \Bitrix\Sale\PropertyValue $prop */
    foreach ($props as $prop) {
        $prop->setCollection($orderProperties);
        $orderProperties->addItem($prop);
        // В своём коде напямую этого сделать не можем, т.к. метод и свойство имеют приватный доступ
        // Но можно сделать обходным путём
//        $orderProperties->setAttributes($prop);
//        $orderProperties->propertyGroupMap[$prop->getGroupId() > 0 && isset($groups[$personTypeId][$prop->getGroupId()]) ? $prop->getGroupId() : 0][] = $prop;
    }
    // Получаем значения профиля
    $profileProperties = \Bitrix\Sale\OrderUserProperties::getProfileValues($profileId);
    // Записываем к заказу
    $orderProperties->setValuesFromPost(array('PROPERTIES' => $profileProperties), array());
}
Обратите внимание, сохранять сущности самостоятельно не нужно, они сохранятся позже в методе save() заказа. Преждевременное сохранение может дать неожиданный результат.