O motivo é que o formato BSON DateTime armazena valores com menos precisão do que um valor .NET DateTime, portanto, quando você o lê de volta no banco de dados, o valor foi truncado.
Se seu valor DateTime for uma propriedade de uma classe C# que você está serializando, você pode pedir ao serializador para serializar o valor DateTime como um documento incorporado contendo o valor BSON DateTime (truncado) e o valor .NET DateTime original (armazenado como Ticks). Nesse caso, o valor não será truncado quando desserializado.
Por exemplo:
public class MyClass {
public ObjectId Id;
[BsonRepresentation(BsonType.Document)]
public DateTime MyDateTime;
}
Você também pode usar um BsonRepresentation de Int64 ou String e não perder a precisão, mas então o documento armazenado somente tem Ticks ou uma representação de string e nenhum BSON DateTime, o que dificulta a realização de consultas relacionadas a DateTime.
Você também deve ter em mente que os valores DateTime são armazenados em UTC no banco de dados. A melhor prática é sempre usar valores UTC para armazenamento e usar apenas horários locais ao exibi-los ao usuário.