En lugar de comparar con la fecha de cancelación en la fila anterior, debe comparar con la última fecha de cancelación en todas las filas anteriores. SQL estándar tiene una opción IGNORE NULLS para lograr esto, pero MySQL no la admite. Afortunadamente, en su caso, se puede reescribir usando un máximo acumulativo:
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;
Ver fiddle