One thing you can do is set up a "sticky" view which pulls out the node you're looking for and then store the nid of the node. You could do this using hook_views_post_execute() in a custom module like so:
function MYMODULE_views_post_execute(&$view) {
$nid = &drupal_static('MYMODULE_sticky_node_id');
if(!empty($view->result)) {
$nid = $view->result[0]->nid; // (or similar)
}
}
(Replace all instances of "MYMODULE" with your module name)
Now if there is a result then it's nid should be stored in a static variable called 'MYMODULE_sticky_node_id'.
Next add a contextual filter of NID to the main view, leave "When the filter value is NOT in the URL" as "Display all results for the specified field", and under the "More" fieldset, tick "Exclude".
Next implement something like hook_views_pre_view():
function MYMODULE_views_pre_view(&$view, &$display_id, &$args) {
if ($view->name == 'your_main_view_name') { // If need be add "&& $display_id == 'your_main_view_display_name'
if ($nid = drupal_static('MYMODULE_sticky_node_id')) {
$view->set_arguments(array($nid));
}
}
}
This will pull out the nid you saved while processing the sticky view and set it as the argument of the main view, therefore excluding it from that view.
You'll need to make sure that the sticky view is rendered before the main view for this to work.
Bear in mind that I haven't tested this exact code so it might need some tweaking to get it to work in context.