It is possible to end up with duplicate ObjectIds but only if you generate them fast enough. But you would have to generate more than 16,777,216 ObjectIds per second, which is pretty hard to do. On my laptop I can only generate about 12 million per second even when the only thing in the loop is the call to ObjectId.GenerateNewId().
In order to understand how you could end up with a duplicate ObjectId consider how an ObjectId is structured. An ObjectId consists of four components: timestamp, machine, PID and increment. The timestamp increments once per second, the machine and PID are fixed for your application, and the increment in incremented by one each time a new ObjectId is generated. The increment is 3 bytes long and rolls over to 0 when it overflows. 3 bytes is enough to hold 16,777,216 unique values, and therefore at most this many unique ObjectIds can be generated per second.
It's possible your duplicate ObjectIds are due to some other cause.
Can you reproduce this in a standalone program you would be willing to share?