Как перебрать из массива до тех пор, пока совпадают даты?
Во-первых, массив надо отсортировать по датам, если он у вас уже не упорядочен. В любом языке программирования есть какая-то функция sort(), которой можно как-то задать, как сравнивать сортируемые объекты (тут вам надо сравнивать только даты).

Ваше условие не очень понятно, но вот, как сгрупировать массив по датам:
st = 0; 
end = 0;
while (st < a.length) {
  end = st + 1;
  while(end < a.length && a[end].date == a[end-1].date) end++;
  console.log(a[st].date);
  for (st = st; st < end; st++) {
    console.log(a[st].id);
  }
}

Тут мы просто откусываем от массива кусок с одинаковыми датами, пока массив не кончится. Если вам нужна только последняя группа, то можно откусить только один раз с конца:
end = a.length - 1;
st = end - 1;
while (st >= 0 && a[st].date == a[st+1].date) st--;
console.log(a[end].date);
for (st = st+1; st <= end; ++st) 
  console.log(a[st].id);

Только учтите, этот код не работает на пустом массиве. Надо отдельно проверить этот случай.
я думаю сначала нужно найти минимальный и максимальный timestamp даты, затем попробовать бинарным поиском отсекать куски, запоминая последний курсор. с каждым отсечением следить за тем, чтобы мы не проскочили искомый период таймстемпов - если мы ищем 18 число, а предыдущий курсор был на 19 числе, а на текущем курсоре мы стоим на 17 числе - то период за 18 число проскочен, и берем тогда этот интервал, и продолжаем уже в нем бинарный поиск.

когда курсор будет на 18 числе в моем примере, начинаем идти от него вниз и вверх циклом for(..;..;..), пока не упремся в границы интервала с обоих сторон