Is the field formatted with a pop up menu?
If not, an OnObjectEnter trigger can perform a script that checks the contents of the field and uses go to next field to move the cursor to the next field in the tab order if there is already data in the field. This only limits access to the field on the layout where you use the trigger. If the field is also present on other layouts, you'll need to take the same steps there to prohibit changing existing values.
If it is a pop up menu, you can still do this, but you have to capture the value of the field passed to the triggered script as a script parameter so that you can use it to revert the value before moving the focus out of the field. (Pop up menus allow the user to select a value before the onObjectEnter trigger trips.)
Thanks Phil. I ended up using an OnObjectEnter script trigger and it solved the issue.