Why were OP_RESERVED, OP_RESERVED1, and OP_RESERVED2 originally reserved?
Since the earliest public release of Bitcoin, OP_RESERVED, OP_RESERVED1, and OP_RESERVED2 have been defined at 0x50 (80), 0x89 (137), and 0x8a (138), respectively.

I doubt there's any known reason for them to exist. The script engine in Bitcoin obviously underwent a lot of changes during development and in the year following; a good portion of all the opcodes were completely rewritten, the behaviour of OP_FALSE was inverted, OP_CODESEPERATOR was effectively removed by execution changes, and so forth. There's many remnants of those changes and removals, and many of the opcodes have non-obvious quirks about how they are handled as a result.
It's worth remembering that the original releases of Bitcoin had &gt; 8 bit opcodes at least partially implemented, and they were removed in the following year, so some of the space was reserved for the byte indicating their extension.

Is there some other instruction set which reserves them (or where reserving them makes the &quot;Bitcoin instruction set&quot; consistent with that instruction set)?

Bitcoin script's instruction set seems to be influenced by a research paper from the early 2000s that describes &quot;security forth&quot;, but the copies of this online seem to be well and truly rotted. Notably, the order of the operators is the same and it has matching oddities such as OP_2OVER and OP_3DUP, but these is shared by a number of other similar languages from the time as well.