The physical insert will start occurring as soon as the Insert Operator in the plan has rows.
In some cases that will be pretty much immediate, but it needs to complete any blocking operators in the SELECT part of the plan prior to the first writes.
For example, if you're doing a large insert into a clustered index, there will likely be a sort operator in the plan to put the output of the SELECT into the order of the index.
A sort is a blocking operator and must be fully processed before it'll release rows to the next operator (in memory, or spilling to tempDB). There are also other blocking operators (e.g. Eager Spools etc.) which will effectively do the same.
Then there are things like hash join operators, which have to scan one of the inputs fully before it'll start releasing any rows, so, in short, there'll often be plenty of reads before you start getting any writes into the target table.