Bah, the zone script was using a static variable to count ticks so that it didn't check the state too often, but the same function was ticking for both instances (each instance using separate data for each course). Because it checked every N ticks and N was divisible by two, in practice only one of the courses was running the cleanup of old races.
Fixed in bugfix release 1.0.12.2.