postgres table sizing inconsistency
I would expect that after shutting down all other sessions and running
  a VACUUM ANALYSE, the way the tables are used wouldn't make any
  difference.


It's the VACUUM ANALYZE that does not make a difference on the size of tables. Because it does not immediately recover the bloat resulting from old versions of rows, it merely marks these rows are reusable.

From the documentation (VACUUM):


  Plain VACUUM (without FULL) simply reclaims space and makes it
  available for re-use


Only VACUUM FULL would recover that space, by rewriting the table from scratch with only the live rows.