I don't know of any. But the absence of proof is not the proof of absence.
I wonder how they came up with this implementation.
Probably, they thought it would be nice to have (run-time) polymorphism
like in other popular OO languages at that time, like Smalltalk. So, the
next question could probably have been how it was currently done in C.
Well, in C it is a common pattern to declare a structure of function
pointers (vtable concept) and have a pointer to such a structure in an
object (vtable pointer concept). The would be one instance of that
structure for every different object type. Next, they probably thought
that it would be nice if the compiler could generate these function
pointer structures and stick the pointer into object automatically. To
do so there needed to be a way to let the compiler know that a (member)
function needed to be in that structure. One straightforward way was to
mark/annotate that function with a keyword, like sticking a virtual in
front of the function declaration. This could have been how virtual
keyword for functions came about. They did that and they saw that it was
good. And then they forgot to document that in the standard so that
people would guessing in the newsgroups till the end of times, and there
would be one more item on the list when defining a C++ ABI