We may need some new replacements here. Generally, we expect there will be some friction where we run up against an OS-provided C struct, and our strategy in general has been to pass safe C++ types as far down as possible, wrapping in UNSAFE_BUFFERS() with a // SAFTEY: comment at the lowest points. This may be the option here.
Alternativley, we'd want cstring_view.h to cover these cases where copying NULs is important (specifically u16cstring_view for this case. This should be implicitly convertible to from u16 strings), so the argument to your function could change to this.
At that point, byte_span_with_nul_from_cstring_view() gets us a src for the copy. But you're right there is no copy-if-fits, so currently one has to check the size manually, or hit a CHECK() in copy_prefix_from(). But it sounds like you want a safe crash if the dest is too small.
Putting this all together, we get
void StatusIconWin::SetToolTip(u16cstring_view tool_tip) {
// ...
auto src = byte_span_with_nul_from_cstring_view(tool_tip);
auto dst = base::as_writable_byte_span(icon_data.szTip);
dst.copy_prefix_from(src);