In the end I used code in the block page visibility settings to only show the block based on whether users had set a value in their CiviCRM profile (a Drupal module). I am posting the code in case it helps others:
<?php
civicrm_initialize( );
//variable used to set if block should be displayed or not - default to not
$show = 0;
//get current logged in user civi id
$contact = CRM_Core_Session::singleton()->getLoggedInContactID();
//get employer id
$org = civicrm_api3('Relationship', 'get', [
'sequential' => 1,
'return' => ["contact_id_b"],
'relationship_type_id' => 5,
'contact_id_a' => $contact,
]);
if(isset($org['values'][0]['contact_id_b'])) {
//get field value
$result = civicrm_api3('Contact', 'get', [
'sequential' => 1,
'return' => ["custom_958"],
'id' => $org['values'][0]['contact_id_b'],
]);
// only show on the members home page
if(drupal_get_path_alias() == 'members/organisation-profile') {
$show = 1;
}
// don't show if they have set a value
if(isset($result['values'][0]['custom_958'])) {
$show = 0;
}
// do show if the value is ''
if($result['values'][0]['custom_958'] == '') {
$show = 1;
}
}
return $show;
?>