Got it, thanks for the super clear demo! Turns out setOpaque() doesn't do anything for tilemap sprites. I'd completely forgotten that detail. The problem is my test for checking whether the tile image has transparent pixels isn't adequate, ignores the padding values we use to trim blank space around the edges of images. Setting the tile index to an invalid index, larger than the number of images in the source table, fixes it because those tiles will be empty so the opacity check fails.
I'll get a fix in now and flag it high priority. Looks like this is what's happening in Sam's case too, so it must be a pretty easy bug to stumble across. In the mean time, the workaround is to use an invalid image table index for the empty tiles instead of an empty tile in the image table.