I'm worried that somehow machine A has had its receiving addresses replaced by external ones to which I do not have the keys. Surely this isn't possible?
The wallet consistency check would catch that. If the offline signer does not recognize the change address, make sure you are using the exact same Armory version for online and offline operations. If that doesn't fix it, make sure the serialization of the unsigned tx is not malformed. For that, load the unsigned tx in both offline and online instances, see what comes out.
If all else fails, then maybe you have a real problem.
Thanks for that. So, yes, that let me generate segwit addresses on the signing machine, but now I'm really confused. The dozen that it generated just now were unique, and not on the lists (as far as i can see) of either of those generated by the online machines. So all three machine are generating (or at least displaying) different lists of segwit addresses.
However, the signing machine did manage to sign a small segwit to segwit test that I did (though these addresses haven't appeared on its list), and has recognised other (at least some) receiving segwit addresses as belonging to my wallets. But not all...
Addresses are bound to their chain index, not the derivation type. There's only 1 address chain in a wallet, and each asset on the chain can instantiated as any script type. Once an address is picked, you can't manually change the script type. If the script type on chain is different than the one in the wallet, that is rectified, but it only works on online machines obviously.
The offline wallet can recognize the "mismatching" addresses because it resolves the script to the actual asset.