/proc is a filesystem because user processes can navigate through it with familiar system calls and library calls, like
close() work on a lot of the "files" that appear in
/proc. For most intents and almost all purposes,
/proc is a filesystem, despite the fact that its files don’t occupy blocks on some disk.
I suppose we should all clarify what definition of the term “file system” we are currently using. In the context of ext4, when we write “file system”, we’re probably talking about the combination of a layout of disk blocks, specification of metadata information about the disk blocks that also resides somewhere on disk, and the code that deals with that on-disk layout. In the context of
/var/run and so on, we’re writing about an understanding or a shared conceptualization of how to name some things. Those two uses of the term “file system” are indeed quite different.
/proc is really the second kind of “file system”, as you’ve noted.