Service utilizei a resolução da aula
import { HttpClient, HttpParams } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { map, Observable, tap } from 'rxjs';
import { Item, LivrosResultado } from '../models/interfaces';
@Injectable({
  providedIn: 'root'
})
export class LivroService {
  private readonly API = 'https://www.googleapis.com/books/v1/volumes'
  constructor(private http: HttpClient) { }
  buscar(valorDigitado: string): Observable<Item[]> {
    const params = new HttpParams().append('q', valorDigitado);
    return this.http.get<LivrosResultado>(this.API, { params }).pipe(
      // tap(retornoApi => console.log('Fluxo do tap:', retornoApi)),
      map(resultado => resultado.items ?? []),
      // tap(resultado => console.log('Resultado após o map:', resultado))
    );
  }
}
A mudança vem no livro.component.ts: 
livrosEncontrados$ = this.campoBusca.valueChanges.pipe(
    debounceTime(pausa),
    filter(valorDigitado => valorDigitado.length >= 3),
    distinctUntilChanged(),
    switchMap((valorDgitado) => this.service.buscar(valorDgitado)),
    tap((items) => {
      if (items === null || items === undefined || items.length === 0)
        this.mensagemErro = '0 resultados encontrados';
      else
        this.mensagemErro = '';
    }),
    map((items) => {return this.livrosResultadoParaLivros(items);}),
    catchError(() => {
      this.mensagemErro = 'Ops, ocorreu um erro. Recarregue a aplicação';
      return EMPTY;
    })
  )
Não fiz alteração em nada além do tap antes do map, fiz a verificação se o array de items ele é vazio, caso seja atribua a variável criada para exibir o erro o valor que eu quero, caso contrário retorna uma string vazia, assim quando eu digitar algum valor no input novamente a mensagem de erro some.