Вы должны разделить $ и операторы следующим образом:
$or : [{$and:...}, {$and:...}]
не так:
$or : [{$and:... , $and:...}]
В противном случае у вас будет $ или запрос только с одной опцией, что практически невозможно выполнить, поскольку единственный случай, когда это условие будет выполнено, - если начало и конец точно равны входным значениям.
Кроме того, вы все еще пропускаете два из четырех возможныхслучаи, когда вы хотите, чтобы все события пересекались каким-либо образом с данным периодом:
$and: [{start: { $lte: start }}, {end: { $lte: start }}]}
$and: [{start: { $gte: start }}, {end: { $gte: start }}]}