When to update agent property that depends on moves of all other agents

This is the correct approach.

You let your agents do their stuff (e.g. moving around) in your agent_step! function. Then you also add a model_step! function that iterates over your agents again (e.g. for id in allids(model); calculate_voronoi(model[id]); end) and you should be golden.