Its interface is defined such that it is explicitly invalid to pass it some other garbage.
7.1.1 A string is a contiguous sequence of characters terminated by and including the first null character.
7.21.2.3.2 The strcpy function copies the string pointed to by s2 (including the terminating null character) into the array pointed to by s1.
Therefore, code which passes an unterminated string to strcpy is not conforming code (because s2 does not point to a "string" as C99 defines it).
Of course, you should use strncpy anyway. But that's not the point.
/me spends too much time in comp.lang.c :S
And it's not just the standard C library that defines it...this definition of string is also supported by the literal string data type.