You could leave Rc::new only parameterized on T, forcing WithWeak, just like HashSet::new always uses RandomState. A separate constructor can create the NoWeak variant. Methods like Rc::downgrade can also be implemented only for Rc<T, WithWeak>.
impl<T> Rc<T, WithWeak> {
fn new() -> Self {...}
fn downgrade(this: &Self) -> Weak<T> {...}
}
impl<T> Rc<T, NoWeak> {
fn new_never_weak() -> Self {...}
}
impl<T, W: RcWeakMode> Rc<T, W> {
// common methods
}