Do the take()s first, before the move happens. Also, there's no point in using if let because the Options will always be Some — using unwrap() instead will simplify the code and remove the appearance of handling impossible cases.
let mut child = Command::new(&path_translated)
.stdout(Stdio::piped())
.stdin(Stdio::piped())
.stderr(Stdio::piped())
.spawn()?;
let stdin = child.stdin.take().unwrap();
let stderr = child.stderr.take().unwrap();
thread::scope(|s| {
s.spawn(|| {
// ... write stdin
child.kill().expect("Failed to kill child process");
});
s.spawn(|| {
// ... read stderr
});
});