It is possible1 to create a freestanding cydlib using musl target, however, it maybe not quite useful as one might expect. rust libstd (musl+cdylib) uses thread local storage (TLS) extensively (even in stdio), even without threads involved explicitly.TLS is implemented in user space in Linux, it's totally depends on libc implementation, so if your application was built with glibc, and the cdylib is a freestanding dynamic shared object (DSO) (statically) linked with musl, then there're two threads implementation, and by no means they're compatible with each other, as a result, if your (freestanding) dso use any TLS (again, this is super common with rust libstd), it would most certainly immediately crash your program.
If you don't use any thread/TLS in the freestanding DSO, it might be fine, then again this is pretty much the same like no_std, with extra complexity, added code size, and less idiomatic.
The catch is it is hard to have multiple different libc implementation live in the same (application's) address space, even with freestanding DSOs, as they're not as isolated as one might have thought. The DSOs have to be loaded by a dynamic linker, part of dynamic linker's responsibly is to setup/initialize TLS for the DSO, and TLS depends on thread (pthread) implementation completely. The dynamic linker also exports symbols (again there's no specification which symbols are exported), __tls_get_addr specifically for TLS, musl and glibc have totally different implementation, as you could have guessed. Even worse, __tls_get_addr from the linker always assume libc is from the exact C code base, it moves data for %fs:<offset>, where <offset> is also implementation dependent, and it is not a simple function (hard to be patched), it accesses thread TCB's in its slow path.