If you update in place, you might use a newly-updated value in the same iteration. This allows paths longer than the iteration count. Example: Edge updates dist[B], then edge uses the new dist[B] in the same round. That allows a -edge path in one iteration, violating the constraint.
Using prev ensures each iteration extends paths by exactly one edge. You read from prev and write to , keeping layers separate. This is temporal separation: each iteration represents one time step.