You probably want to do the grouping in the inner query rather than the outer query. Also, can limit parameter values to 1-4 in the inner query itself.
SELECT a.BoxId, b.value1, b.value2, b.value3, b.value4
FROM boxes a
LEFT OUTER JOIN (
SELECT boxid,
MAX(CASE WHEN parameter = 1 THEN field1 END) AS value1,
MAX(CASE WHEN parameter = 2 THEN field1 END) AS value2,
MAX(CASE WHEN parameter = 3 THEN field1 END) AS value3,
MAX(CASE WHEN parameter = 4 THEN field1 END) AS value4
FROM widgets
WHERE
parameter BETWEEN 1 AND 4
GROUP BY boxid
) AS b ON a.boxid = b.boxid
SQL DBA,SQL Server MVP(07, 08, 09) A socialist is someone who will give you the shirt off *someone else's* back.