Here's a guess:
-- ALWAYS check first using a SELECT
SELECT
l.rack, l.bay, l.height, l.qty, x.TotalStock, x.Warehouse, x.Bin
FROM [SLGWarehouseLayout] l
CROSS APPLY (
SELECT SUM(i.QtyOnHand1) AS TotalStock, i.Warehouse, i.Bin
FROM InvMultBin i
WHERE i.Warehouse IN ('W1','SC')
AND i.QtyOnHand1 <> 0
AND LEFT(i.Bin, 1) = LEFT(l.Rack, 1)
AND SUBSTRING(i.Bin, 3, 2) = LEFT(l.Bay, 2)
AND SUBSTRING(i.Bin, 2, 1) = LEFT(l.Height, 1)
GROUP BY i.Warehouse, i.Bin
HAVING SUM(i.QtyOnHand1) > 0
) x
-- If the SELECT works, convert it to the UPDATE equivalent
UPDATE l SET
qty = x.TotalStock
FROM [SLGWarehouseLayout] l
CROSS APPLY (
SELECT SUM(i.QtyOnHand1) AS TotalStock
FROM InvMultBin i
WHERE i.Warehouse IN ('W1','SC')
AND i.QtyOnHand1 <> 0
AND LEFT(i.Bin, 1) = LEFT(l.Rack, 1)
AND SUBSTRING(i.Bin, 3, 2) = LEFT(l.Bay, 2)
AND SUBSTRING(i.Bin, 2, 1) = LEFT(l.Height, 1)
GROUP BY i.Warehouse, i.Bin
HAVING SUM(i.QtyOnHand1) > 0
) x
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