I checked Irfanview and NeoPain. As far as I can tell, neither saves in 16bit BMP format. Infraview has an option "(24 BPP, simple RGB-565)", but it seems to output 24bit images. Maybe I'm missing something.

Hmm, it seems you are right, sorry for the confusion! I never used it but kind-a expected, if conversation is there, it will try to save in lowest possible (16bit in that case)

There's an scholarly analysis of the bit-replication method in the PDF HERE.

Even if you happen to be edumacated like me (can count all the way to 20 ifn you take my socks off), there's a simple chart near the end which shows the accuracy of this method compared to ideal.

Sorry if I'm going to ruin your 'dream' for ideal, but here ideal is simple linear interpolation, the same you achieved by x8,22. Once you do 8->5 bit, the 3 bits are gone forever. That's why, when you do the inverse 5->8 regardless what value you choose for the missing 3 bits will be a wild guess. So it doesn't really matter what function you will choose. Is it simple right shift, is it going to be multiplication with a constant, or bit-replication - doesn't matter, your chance for guessing the original value is 1 of 8.

What that mean? If you make converter, just implement whatever is easier/faster for you. If you strive for accuracy - implement at least 2 methods that output different values and then you decide which is better (subjective)