The problem here is that the baking code uses tiles to exchange pixel data with the renderer since a recent-ish refactor, but the code that sent data to the renderer did not initialize the bake result pixels. Therefore, when the baking process for the second object started, Cycles received empty tiles and sent them back as-is if the second object did not cover them. By initializing the tiles with the result of the previous bakes, we avoid this problem.