Earlier quoted context omitted.
I'd say just use memcpy.
How does that help? You have the same bookkeeping problem with memcpy as you do with strncat.
It's also a complete idiocy to possibly not copy everything. I've never wanted that. It's begging for bugs. If there's not enough room to copy all the source bytes, you either know that in advance or you want to crash hard.
Even memcpy itself is hardly necessary as a library function. It's a simple loop. But at least it's what you would write anyway, and in some cases compilers are able to optimize it (with questionable benefits).