These symbols are defined in two objects, yes: there are definitions in both crt0.obj and dllcrt0.obj. These objects contain the startup code for EXEs and DLLs, respectively.
The trick here is that there should never be a case where both objects are linked into a single module. The linker does not pull all objects from a library into a link; instead, it only pulls in any objects that are required to satisfy dependencies. There is no case where both crt0.obj and dllcrt0.obj will be linked into a single module; their use is mutually exclusive.
Basically, there can be many definitions of the same external symbol in a library, so long as [1] each definition is in a different object and [2] only one of those objects is actually used in the link.