Ok - I seem to have fixed it.
I went into my database to look at the metadata in a bit more detail. In the postmeta table, I noticed there were reams and reams of entries with post_id reference '0'. This suggested to me that it was actually these posts' meta (rather than ALL posts' meta) that were being pulled into the custom fields because they had no specific post id, so they acted like a wildcard.
Soooo... I deleted them all by hand. An absolute ball-ache, but as I'm new to all this, it was the only way (a search query threw up nothing).
After checking that there were no '0' post_id'd entries left, I backed it all up again, checked my site to see if any of the custom field-related items were affected (they weren't), re-added the code Gary took out of edit-form-advanced.php and checked the Write Post once again. No renegade custom fields. Checked the Manage Posts again, and the custom fields were back.
I don't want people to see this as 'the answer' because I really am a novice at databases and wouldn't want to put false information out there. But this did work for me, and I think its quite important because using Gary's hack will mean that a wrongly-entered custom field will disappear into the database, and potentially cause problems if you can't edit it from the post page itself.
I hope this is helpful, or at least interesting to someone!