Смотрите, чтобы данные визуально отобразились, нужно чтобы сработала детекция изменений в этом компоненте.
В случае использования rxjs, вызов подписок инициирует обнаружение изменений (ну на самом деле немного сложнее, но и так норм), а вот если вы просто объект поменяете, то нет. Придется как-то отслеживать эти вещи вручную.
хотя есть другой компонент, который аналогично в конструкторе вызывает getBooks и сохраняет локально, там данные обновляются при каждом изменении массива в сервисе
Скорее всего в этом компоненте есть какое-то взаимодействие с пользователем, генерация событий.
Обязательно ли здесь использование rxjs?
Можно ли работать с Ангуляром, но не использовать rxjs? Можно. К примеру дергать какое-нибудь событие, а компонент будет его слушать и выполнять detectChanges. Можно mobx к этому делу приспособить, например. Можно приделать каких-нибудь костылей наподобие vuex, т.е. сделать сеттеры, которые обновляют компонент. Или эффект в redux.
Нужно ли работать с Ангуляром, но не использовать rxjs? Безусловно нет. В сервисе данные храните как поток (сабджекты и их производных) или shareReplay, или исползуйте какие-то надстройки, типа ngrx и прочих.
Rxjs тесно связан с самим Ангуляром и используется практически везде, не знаешь rxjs - не знаешь Ангуляр.