Не полностью протестировал его, но вы можете попробовать использовать expand
для рекурсивного вызова http до определенного состояния
of([0, []]).pipe(expand(([i, result]) =>
this.http.get('url?page=' + i).pipe(
map(res => res.hasNextPage ? [++i, result.concat[res]] : false),
)),
takeWhile(res => res)
)