Why does the behavior of array syntax differ from '(?,?)' syntax when updating a point field and that field is NULL?
Per documentation:


  It is possible to access the two component numbers of a point as
  though the point were an array with indexes 0 and 1.


But geometric types are not arrays.
 While the value as a whole can be NULL, parts of a point (or any geometric type) cannot.

All geometric types can be input as string literals and cast to the respective type. None of them accept NULL as part of the input. This results in an error message:

SELECT '(NULL,1)'::point;



  ERROR:  invalid input syntax for type point: "(NULL,1)"
  LINE 1: SELECT '(NULL,1)'::point


On the other hand, if you try passing one or more NULL values to a constructor function, you get NULL for the whole value - which is a bit inconsistent, but still makes sense: if one component is unknown, the whole value is unknown. All of these tests return TRUE:

SELECT point(NULL, NULL) IS NULL
      ,point(1, NULL) IS NULL
      ,point(NULL, 1) IS NULL
      ,point(NULL, 1) IS NULL
      ,circle(point(1, 1), NULL) IS NULL;


This leaves the case where an UPDATE silently ignores an assignment of NULL to pt[0] or pt[1]. This should really do one of two things:


Set the point to NULL - like SELECT point(NULL,1) does.
Raise an exception - like SELECT '(NULL,1)'::point does.


I would say this is a bug and should be reported.