Можно написать функцию, которая всегда возвращает Observable. Если необходимо получить промис - просто оборачиваете вызов функции в `firstValueFrom` или `lastValueFrom` из rxjs.
То, что вы изначально написали, можно решить расширенным Observable, что-то вроде (псевдокод)
class ObservableWithThen extends Observable {
then(cb) {
return firstValueFrom(this).then(cb);
}
}
И в функции вместо обычного Observable создавать и возвращать ObservableWithThen