Em vez de comparar com a data de cancelamento na linha anterior, você precisa comparar com a data de cancelamento mais recente em todas as linhas anteriores. O SQL padrão tem uma opção IGNORE NULLS para conseguir isso, mas o MySQL não a suporta. Felizmente, no seu caso, pode ser reescrito usando um Cumulative Max:
select t.*,
datediff(start, prev_cancelled) as num_days_since_cancel
from (select dt.*,
max(cancelled) over -- latest date per id
(partition by id
order by start
rows between unbounded preceding and 1 preceding) as prev_cancelled
from dt
) t
-- remove negative duration
where datediff(start, prev_cancelled) >= 0;
Consulte violino