Для каждого subscribe отрабатывает вся цепочка, такое вот поведение.
Быстрое решение:
let x = search$
.distinctUntilChanged()
.do(() => console.log('search called!'))
.mergeMap(() => query())
.shareReplay(1);
Полезное чтиво, чтобы разобраться с холодными и горячими Observable:
https://medium.com/@benlesh/hot-vs-cold-observable...