Answer
For a reference-type custom field, you can't pass the display value directly — you need to fetch the actual OBJKEY of the record being referenced (via a cursor against whatever table/LU the reference custom field actually points to) and pass that OBJKEY as the attribute value instead, using Client_SYS.ADD_TO_ATTR('CF$_YourFieldName', objkey_value, attr_string) before calling the *_CFP.Cf_Modify__ method the same way you would for a plain field. A genuinely useful way to get the exact working call for any specific custom field: manually update that field once through the normal client with the Debug Console open (Ctrl+Shift+D), then copy the generated modify call straight from the Debug Console's PL/SQL Details tab — this gives you a confirmed, correctly-formed template for that exact field rather than needing to guess the right attribute/objkey structure yourself.