Why columns in views are always nullable?
It sounds like this is just the way it is in PostgreSQL (which I understand is a sucky answer). It seems like under certain conditions for certain versions of PostgreSQL, a view's column may be attributed as non-nullable. This StackOverflow answer gives the example where if the field is a primary key of the base table, in a vanilla view, it is showing as non-nullable in the view's schema.
I suppose PostgreSQL has some strict requirements on what it assumes can truly be non-nullable in a view definition.