The first thing I would look at is - what is your request intake process? Are engineers being directly asked to do things? When scope is added, how is it added? There needs to be a handle on that, and depending on who has the "power" in the situation (sometimes product, sometimes engineering), those with the decision making power need to make a tradeoff between the newly requested work and the currently requested work.
Steps to achieve this:
1. Document every request coming in, in an issue tracker of some sort. If work is not tracked, it can't be prioritized. That includes requests from outside, and infrastructure/tech debt work going on within the team.
2. Start rewiring the requests through a TPM, or the person responsible for keeping up to date on the current priorities of the business. This both helps the engineers not get distracted, and provides the TPM an ability to ask about tradeoffs or balance priorities before it gets to the engineers.
3. Have the TPM start maintaining a priority backlog, with all the things that need to be done. Then, when a new high priority task comes in, the TPM can easily explain how this request effects other work. Often times the workload of a team is a black box to any requestor. Making it clear how many things have to be done can turn a "high priority" task into
4. Finally, start making the requesters horse-trade amongst themselves. When someone else's projects start being pushed around by another person's they tend to be able to hash it out between them what is the higher priority.