Answer
Three viable approaches, roughly in increasing order of control: (1) make the read-only change at the form level and apply it to the Base Profile, so every user inheriting that profile picks it up automatically; (2) use a Conditional Field to make the column read-only based on a condition; (3) use a Custom Event — more setup, but the most control, since 'read-only' in practice often really means 'don't let the user change an existing value,' and a Custom Event can enforce that precisely and globally (e.g. blocking changes only once a field already has a value, rather than blanket-blocking all entry into it).