The latter part might be possible in Inform 7, sort of.
Keep track of the most recently issued Response:
The most recently issued response is a response that varies.
After issuing the response text of a response (called R): now the most recently issued response is R.
Add a table to keep track of the replacements:
Table of Response Replacements
original (response) replacement (text)
with 10 empty rows.
Make a new action:
Response-replacing is an action out of world applying to a topic.
Understand "new response [text]" as response-replacing.
Carry out response-replacing:
choose a blank row in the Table of Response Replacements;
now the original entry is the most recently issued response;
now the replacement entry is the substituted form of "[the topic understood]".
Report response-replacing:
say "[bracket]Response replaced.[close bracket]".
(I don’t know if there’s a way to alter a response through a pointer? If so you could do this in another Carry Out rule, so that the new response is used for the rest of the play session.)
And finally print all of this when the player wants it.
To give new response code:
say "Section Z - New Responses[line break][line break]";
repeat through the Table of Response Replacements:
say "The [original entry] is '[replacement entry]'.[line break]".
You could also print this to a text file if you liked. Either way it gives code you can copy-paste into Inform to change those responses.
Disclaimer: this is not tested.
You could also allow replacements just for specific actions, not full responses. Keep track of the action being performed (using a stored action), then print out Instead rules. This part would be significantly simpler. And a cleverly-written Instead rule could check the table for each action and give the new response if it found one, so changes would take effect “immediately” (i.e. without a recompile, though they wouldn’t be a permanent part of the game yet).
…now I’m intrigued by this idea. If I created an extension for this, would others find it useful? I personally test in the IDE so the source code is always at hand, but others might do things differently.
EDIT: Teaching new verb and noun synonyms would be possible in the same way. The commands would have to be phrased differently, as Inform doesn’t let you have a command applying to two topics, but you could use some of the I6 code from “oops” to store the misunderstood word, then have a command like “>means examine” that would add that word as a synonym for “examine” or whatever. (The I7 code it generated would be something like “understand the command ‘watch’ as ‘examine’.”.)