I think larger structs (larger than 2 words) are allocated on the stack if they don't escape the defining scope — if they're not return values and not captured by an escaping closure. Analogously, instance properties of struct type can be allocated within the memory block of the enclosing type, which may be stack or heap depending on the requirements of the enclosing type.
However, it's slightly more complicated than that, because some structs (value types) may be represented as reference types internally, regardless of size. For example, String values likely have an allocated block for their character storage, though String variables have value semantics. (Except that some short strings are represented by tagged pointers, and so use no data storage, and maybe some other short immutable strings are stored as structs really.)
Also, I believe I read or saw somewhere that Swift may at some point implement the allocation of class (reference type) object memory on the stack instead of the heap, if the value doesn't escape the defining scope.
AFAIK, the witness tables aren't about virtual dispatch of struct methods (there is no virtualization, because no inheritance), but about resolving the correct method to use when struct values are referenced via a protocol. It's similar to virtual dispatch in that the choice of the method has to be done at run time, but its main purpose (I would say) is to allow the reference (40 bits including pointer to witness table) to be small and fixed size, while the information need to dispatch the method may be large and vary in size between different methods.