Letting the user define the arguments in a custom loop? (the “$custom_posts->query(…)” part)

the easiest way would be to create a simple form :

<?php $nonce= wp_create_nonce  ('my-nonce'); ?>
<form name="user-query" method="post">
<input type="hidden" name="_wpnonce" id="_wpnonce" value="<?php echo $nonce; ?>"/>
<p>Locations:
<select name="location" id"location">
  <option value="location1">location1</option>
  <option value="location2">location2</option>
  <option value="location3">location3</option>
  <option value="location4">location4</option>
</select></p>
<p>Sections:
<select name="section" id"location">
  <option value="section1">section1</option>
  <option value="section2">section2</option>
  <option value="section3">section3</option>
  <option value="section4">section4</option>
</select></p>
<input type="submit" name="create-query" value="create query"/>
</form>

and catch that for submit and process

if (isset($_POST['create-query'])){
    $nonce=$_POST['_wpnonce'];
    if (! wp_verify_nonce($nonce, 'my-nonce') ) die('Security check');
    if (isset($_POST['location']) && isset($_POST['section']) ){
        $args = array(
            'post_type' => 'blocks',
            'location' => $_POST['location'],
            'section' => $_POST['section']
        );
        $custom_posts->query($args);
    }
}

and i would add some security checks but this should get you going.