Ah --- sorted!
The 1 is being returned because an error is occurring further up the file, which is being hidden in amongst the other output. These lines:
g/:w/s/^\(...\).*/#define C_\1(w) CC_opcst(op_\1, w)\
#define C_\1_narg() CC_opnarg(op_\1)/
...worked in 1.10, but not in 1.14; you can't replace with a literal newline like this any more and 1.14 is producing an 'invalid newline substitution' error. So the 1 status code was actually ed trying to be helpful and telling me that something was wrong.
So I believe that's all WAI.
On a related note --- any ideas how to adjust the script to work on modern eds? Line splitting inside a g is explicitly forbidden by both Posix and the GNU ed manual for reasons of ambiguity.