The operator do not affect the sequence, you simply "hook" into it, get its current data and can start any side effects on the basis of these data (the execution result of the function do not affect the data that will be in the next operator or the final subscription). The timer you signed after the statement, do so first execute the actions in the do, then subscribe.
Similarly, every action performed by any other operator before you get to subscribe, but other operators or otherwise change the original sequence.
To achieve the desired behavior, you can record a sequence into a variable and subscribe to her 2 times in the right order:
const obs = Observable.timer(0, 3000);
obs.subscribe(i => console.log(i));
obs.subscribe(i => console.log('tick', i));