-- The WHERE clause must be evaluated for each row in the Stock table
-- in order to determine which rows qualify for the UPDATE.
-- The likelyhood of a table lock might be high.
-- So, determine which rows qualify without locking the stock table for update.
-- Capture the PK of the stock table, and the new value.
SELECT s.PrimaryKey, x.NewequivQty
INTO #Stock
FROM Stock s
LEFT OUTER JOIN Pack p
ON s.Product = p.ProductId
AND s.Pack = p.PackId
CROSS APPLY (
SELECT
OldEquivQuantity = ISNULL(s.equivQty,0),
NewequivQty = s.Qty * ISNULL(p.Factor,4.5) / 4.5
) x
WHERE x.OldEquivQuantity <> x.NewequivQty
-- Then apply the update, touching only the rows which will be updated
-- The downside? You end up reading the stock table twice.
UPDATE s SET equivQty = NewequivQty
FROM Stock s
INNER JOIN #Stock st
ON st.PrimaryKey = s.PrimaryKey
For fast, accurate and documented assistance in answering your questions, please read this article.
Understanding and using APPLY, (I) and (II) Paul White
Hidden RBAR: Triangular Joins / The "Numbers" or "Tally" Table: What it is and how it replaces a loop Jeff Moden