Für den Subselect kannst du eine Klammerstufe weglassen, da nur der Select-Ausdruck in Klammern zu setzen ist.
Ein Alias betrifft nur den jeweiligen Kontext, in deinem Fall nur die Subselects. Der eine Subselect hat mit dem Anderen nichts zu tun.

Nun zur Reihenfolge:

Die Where-Klausel des Hauptselects schließt nur die Zeilen ein, die für den Update relevant sein sollen.
Der 1. Subselect hat aber eine andere Beziehung als der Hauptwhere und somit kann es eben vorkommen, das zu dem zu ändernden Satz das Pendant gar nicht vorhanden ist. Also nicht für jeden Typ-N-Satz gibt es auch einen Typ-2-Satz.
Und genau dann kommt es zum NULL-Ergebnis.

Der 2. Subselect (exists) stellt nun sicher, das für jeden zu ändernden Satz auch ein Pendant als Quelle vorhanden ist und somit NULL-Werte ausgeschlossen werden (solange nicht NULL auf Feldebene zulässig wäre).

Du könntest den 2. Subselect weglassen, wenn du den 1. in "coalesce((select ...) + 1.8, a.Wert)" änderst. Dies führt aber u.U. zu mehr unnötigen Änderungen, da ja der Satz ohne pendant mit sich selbst überschrieben wird.

Zu guter Letzt, betrachte mal deinen Inner-Where:
where b.Jahr = 2020 and b.Typ = '2' and
a.Jahr = b.Jahr
and a.Artnr = b.Artnr

Da du im Hauptwhere bereits auf 2020 einschränkst, kann die zusätzliche Einschränkung im Subselect doch entfallen.

Generell gilt beim Subselect:
Ist kein Ergebnis zu finden, wird NULL gemeldet, also genau das selbe wie auch beim Left Join.
Einen "Inner-Join"-Subselect gibt es nicht.
Es gibt daher auch immer mal wieder viele Joblog-Hinweise, dass NULL-Indikatoren fehlen:

select count(*) into : MyCount
from table
where ....

Da hierfür kein Cursor verwendet wird, betrachtet SQL dies wie einen Subselect und liefert NULL falls die Whereklausel nichts findet.
Machst du das selbe per Cursor (wie z.B. via STRSQL), bekommst du ganz normal 0 geliefert.
Besser wäre dann hier:

select coalesce(count(*), 0) into : MyCount
from table
where ....

oder eben einen NULL-Anzeiger (nicht zu vergessen, den NULL-Anzeiger abzufragen oder das Zielfeld vorher zu löschen, da es im NULL-Fall den vorherigen Wert behält).