let mut b: [u8; 100] = [0; 100];
let b2: [u8; 10] = [1; 10];
let b3: [u8; 10] = [2; 10];
let b4: [u8; 10] = [3; 10];
let b_ptr: *mut u8 = addr_of_mut!(b).cast::<u8>();
However, writing to a raw pointer in this way still requires mutable access, so it is equivalent to first creating a &mut reference to a subslice of b then writing to that. So it might not solve your problem here. Why exactly are you trying not to rely on a &mut reference?
Thanks. Here is the larger context - I have a large buffer and I have multiple threads writing into it. Now I can get an offset into the larger buffer using atomics pretty easily. However when I copy into the buffer I don't want to rely on having &mut reference to it, because in order to do so I have to serialize the writes. I would like the writes to happen in parallel.