This may just be a clarification required, but when you create a custom field there is an option for:
View Only? Is this field set by PHP code (via a custom hook). This field will not be updated by CiviCRM.
It should be noted that if this is enabled, the fields cannot be updated by changing or adding the value in hook_civicrm_pre.
The wording of the help text suggests this would be possible. It may be better to say '...field is set by the API only' ?