... because then the lookup field stops working on the UI: if you create a new record from the "New" button on the related list from the parent object, the lookup field won't be populated, as it would when it's not read-only.
This is just the way it is, and I haven't found an explicit reference in documentation on why that is, or even the behavior is there. Please note that this is not the same for standard objects. For instance, the Account Name field on Contact will still work - populating correctly - if it's made read-only on a page layout.
So if you're looking this direction for a simple way to discourage reparenting (like I did), stop.