I2C Slave ACK not driving down sufficiently
@DoxyLover and the others are right: the master was pulling up, causing driver contention. My mistakes were:


Assuming that configuring the I2C peripheral (alternate function in STM jargon) would automatically set SDA as open drain.
In my bit-banging code, configuring the wrong port for open drain (leaving SDA still push-pull and leading me to believe that the master was not the issue).
Assuming that the functional state of the NT3H2211 does not change during testing. Once I corrected the open drain issue, I saw no ACK at all! It turned out the NT3H2211 failed somewhere along the way. Swapping the NT3H2211, and running the corrected code, fixed the problem.