I haven’t found any meaningfulness of sentinels of many-item pointers.
The sentinel might be meaningful for slices, but when slicing a many-item pointer with sentinel to get a slice or a pointer to array, the sentinel info will be always lost.
If you slice to a specific length you won’t get the sentinel unless you explicitly slice using the ptr[start..end :sentinel] syntax, which asserts that there’s a sentinel with the correct value after end.
In practice, virtually every piece of code that consumes sentinel-terminated many-item pointers will compute the length of the string/sequence by iterating over the elements until it reaches the sentinel, and then slice using the computed length:
In Zig std, you would conventionally use std.mem.len(), std.mem.span() and std.mem.sliceTo() instead of doing the manual while loop. In C, you would conventionally use strlen() to compute the length of a [*:0]const u8 pointer.
Outside of interop with C, sentinel-terminated many-item pointers can be useful if space is a concern. A [*:0]const u8 value takes up half the size of [:0]const u8, so if you have a lot of string data you might choose to only store the pointers and not the lengths, with the trade-off that lengths will need to be re-computed upon use.