One of the first things I learnt about Firebird (well, it might have been InterBase) was to never use IN (<subselect>) since it was exceedingly slow (it may be better in newer versions of Firebird). Luckily, replacing IN (<subselect>) with EXISTS(<subselect>) is trivial and I've never even wanted to use IN (<subselect>) the last 26 or 27 years and only use IN with constants.
In your case, using MERGE may be a better alternative, e.g. (completely untested)
MERGE INTO ITEMS I
USING (SELECT P.ITEMNO, SUM(IM.IN_Q) IN_Q_SUM, SUM(IM.OUT_Q) OUT_Q_SUM
FROM PLIST P
JOIN ITEMMOVEMENTS IM ON P.ITEMNO = IM.ITEMNO
WHERE
P.ID = 2) TMP ON I.ITEMNO = TMP.ITEMNO
WHEN MATCHED THEN UPDATE SET I.IN_Q = TMP.IN_Q_SUM, I.OUT_Q = TMP.OUT_Q_SUM
You never mentioned it, but you can also use MERGE for inserting in case there should happen to be ITEMNOs in PLIST and ITEMNOVEMENTS that does not yet exist in ITEMS.
Hopefully this can get you started,
Set