For me get_posts() worked fine for a simple (non-paged) list. I just put a – before the category numbers I wanted to exclude, something like:
<?php
$postslist = get_posts(‘category=-39,-15&numberposts=-1&order=ASC&orderby=title’);
foreach ($postslist as $post) :
setup_postdata($post);
?>
<?php endforeach; ?>
My example lists all posts not in category 39 or in category 15, sorted by title.
To sort by date, most recent first, I use something like ‘category=-39,-15&orderby=date&order=DESC’.