Creo saber donde radica el punto de confusión, el hecho de que conviertas explicitamente a Object la constante DBNull no quiere decir que el tipo de la expresión de la derecha tenga que ser Object, de hecho en la instrucción en c# que has adjuntado puedes cambiar la expresión donde realizas la conversión y verás que dará el mismo resultado. El sentido de convertir a object la clase DBNull tiene que ver porque no se puede resolver una conversión implícita entre DBNull y Date con independencia de que los tipos permitan valores Null.
[...] Por otro lado el código que posteas funciona , como lo comentas, pero no sirve para castear a null de la base de datos.
Reitero mi pregunta, ¿seguro de tus afirmaciones?, fíjate:
cmd.Parameters.AddWithValue("@FechaVen", If(.FechaVen.HasValue, .FechaVen.Value, DirectCast(DBNull.Value, Object)))
Si la instancia de la clase Struct<DateTime> contiene un valor en el tipo subyacente entonces lo obtenemos mediante la propiedad Value, por el contrario insertamos DBNull
Finalmente, no resto valor a tu propuesta de hecho imagino que sí funciona, sin embargo pienso que eso se hacía años atrás cuando no existía la característica de permitir valores Null a los tipos de valor, bajo tu propuesta ¿te imaginas como quedaría una clase POCO donde la mayor parte de las propiedades permita null?, todos con el tipo Object y no con el tipo adecuado, reitero, no digo que no funcioné, digo que no es correcto.
Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.