Вы излучаете «3» и «4» до того, как concat подпишется на observable2. concat еще не подписался на observable2, потому что он ожидает завершения observable1. К тому времени, когда concat подписывается на observable2, события «3» и «4» исчезают.
Как аналогия: представьте, что у вас есть два человека, которые бросают шары, и у вас есть один ловец. Вы сказали ловцу поймать все шары от первого метателя, а затем переключиться на второго метателя. Первый метатель бросает два мяча в ловушку, второй метатель бросает два мяча никому, потому что ловец ждет, чтобы увидеть, собирается ли первый метатель бросать больше шаров. Затем первый метатель говорит ловцу, что он бросил шары. Ловец тогда начинает наблюдать за вторым метателем, который говорит, что он также сделал. В конце концов, улавливатель поймал только два шара.
Если бы вы превратили observable2 в ReplaySubject
, у которого был достаточно большой буфер, он воспроизвел бы все события, полученные для каждого подписчика, и вы бы получите желаемый результат.