Вы называете setProducts итерацией l oop. Вы должны вызывать setProducts после того, как отфильтруете их, так что он вызывает изменение состояния только один раз
const [products, setProducts] = useState();
const DeleteProducts = () => {
const selectedItems = [5, 4, 3];
let newProducts;
selectedItems.forEach(function(p) {
newProducts = products.filter(prd => prd.id !== p);
});
setProducts(newProducts);
}
лучше, но вы можете фильтровать его быстрее, как это, без зацикливания
const DeleteProducts = () => {
const selectedItems = [5, 4, 3];
const newProducts = products.filter(prd => selectedItems.indexOf(prd.id) >= 0);
setProducts(newProducts);
}