The implementation in sage/modules/vector_symbolic_dense just inherits from FreeModuleElement_generic_dense, without overriding any methods like _add_ or _new_c. In particular, the arithmetic operations in FreeModuleElement_generic_dense hard-code the class, so that arithmetic always creates a new FreeModuleElement_generic_dense (as you're seeing).
cdef _new_c(self, object v):
# Create a new dense free module element with minimal overhead and
# no type checking.
cdef FreeModuleElement_generic_dense x
x = PY_NEW(FreeModuleElement_generic_dense)
in FreeModuleElement_generic_dense to
cdef _new_c(self, object v):
# Create a new dense free module element with minimal overhead and
# no type checking.
cdef FreeModuleElement_generic_dense x
x = <FreeModuleElement_generic_dense>PY_NEW(<object>PY_TYPE(self))
David