You don't need the ChangeDetectionStrategy.OnPush on that subcomponent, that is your main issue. If you just comment out Line 7 in subComponent.ts, the example works as (presumably) intended.
But why?
Because OnPush strategy tells Angular component to only check for changes if the reference (on @Input) changes. But it didn't - your Input is always parent component's `data$` observer. Observer did not change.
Now, it also explains (at least partially, at least to me) why you never see "test 1" string. Both first and second changes (test 1 and test 2) were done in the callback to data$ observer constructor. And piled up there. And after all of those, observer already had the latest value "test 2". Then you do constructrors and OnInit calls. So by the time change comes in to your subcomponent, it only has one meaningful change - the first one it sees is from null to test 2.