Start here. This is the direct spoken answer to practice first.
Why this question matters
Bulk updates are where normal entity-by-entity code can become slow or memory-heavy. EF Core set-based operations are useful, but they change what application code participates in the update.
I would use ExecuteUpdate when I need a set-based database update that does not require loading each entity into memory. For example, marking expired sessions as inactive can be one SQL update instead of loading thousands of rows, modifying objects, and calling SaveChanges. It avoids change tracker overhead and reduces round trips. The trade-off is that entity callbacks, tracked state, and some per-entity logic are bypassed.