Updating a VBO (especially its size) via glBufferData() can potentially change it's physical memory address, though not its buffer object name as set by glGenBuffers(). A VBO is linked to a VAO via a call to glVertexAttribPointer(), where information about the VBO (buffer object name? Memory address?) is stored in the VAO. The VAO becomes available for update and drawing when it is bound via glBindVertexArray(). Does GL recompute the VBO address at that time? The VAO may or may not be bound when a VBO it links to gets updated via glBufferData().
Depending on when the buffer object name is translated to a physical memory address, I can imagine that the VAO could be updated for the changed VBO merely by binding the VAO again after changing the VBO; or, it may be necessary to more thoroughly update the VAO with another call to glVertexAttribPointer().
So part of this question is: what information about the VBO is stored in the VAO? If it is just the buffer object name, then it shouldn't be necessary to call glVertexAttribPointer() again after changing the VBO contents.
Perhaps such details are not part of the API specification, and so the only safe practice is to update a VAO via glVertexAttribPointer() after every update of a linked VBO.