I spent the day working on diagnosing further.
I disassembled the air box and completely removed everything so I could access the IAC. I cleaned it and the opening it is inserted into with carb cleaner (wasn't that dirty). I also turned a bottle of air in a can upside down and used it to cool the sensor when it was hot and the bike was failing to idle. It improved it temporarily but went back to failing quickly thereafter.
I removed the IATS and hit both the exposed part and body of the part with the compressed air. It made no difference.
The IMC cable slides smoothly. I was able to actuate it by hand but I did not observe it moving when I twisted the throttle in neutral on the stand.
The bike makes this whistling sound when it starts to stumble, like an asthmatic trying to grab for a breath. I took a video of it but won't be able to upload it until later.