Creo que lo descubrí después de revisar los documentos de mongo. Básicamente, hay es una diferencia en la semántica entre esos dos. Esencialmente, en la primera forma de la consulta {c: {d: d1}} , mongo asume que estás especificando el todo subdocumento. Entonces, si tiene un subdocumento {c: {d: d1, e: e1}} , no coincidirá.
OTOH, la segunda forma de la consulta {'c.d': d1} implica que solo está especificando una coincidencia en un campo dentro del subdocumento. Esto coincidiría incluso si el subdocumento tiene otros campos o sub-subdocumentos completos.
Esta diferencia se extiende al índice. _ensureIndex({c: 1}) y _ensureIndex({'c.d': 1}) son dos índices diferentes, y aunque el primero indexa todo el subdocumento, no se utilizará si consulta un campo individual con el c.d notación.