Efectivamente, es importante que los archivos que deben permancer privados queden fuera del document root. Ya que solamente estarán accesibles para los usuarios mediante código PHP, que se encargaría de realizar las validaciones oportunas antes de proporcionar su descarga o visualización al usuario. Este es el tema del artículo Proteger archivos descargables en PHP.
El medio de subir los archivos fuera del document root en principio es el mismo que usas para subir cualquier archivo en PHP. El único detalle es que, cuando haces el move_uploaded_file(), indicas la ruta de donde tienes que colocar los archivos.
Sería algo parecido a esto:
$nombre_archivo = $_FILES['userfile']['name'];
$carpeta_de_subida = '../../data/uploaded_files';
move_uploaded_file($tmp_name, "$carpeta_de_subida/$nombre_archivo");
Si te fijas, la carpeta de subida se colca con una ruta relativa al archivo PHP que estaría ejecutando ese código y tendríamos que subir varios directorios hacia arriba, los suficientes para salir del document root.