Get draft content in front end form
Figured this out myself.

The 'getDraftsByEntryId' function is only intended for displaying the list of drafts, so there is no need to populate the model (a potentially expensive task). Indeed, there is a line that unsets the 'fields' part of the data in the EntryRevisionsService.php file:

// Don't initialize the content
unset($result['data']['fields']);


Handily, there is another function called 'getDraftById' that I was able to use, which does populate the model. Therefore, my amended (and working) code is:

{% set entry = craft.entries.section('events').type('ofs').status(null).limit(1).first() %}
{% if entry and entry.enabled %}
    {% set drafts = craft.entryRevisions.getDraftsByEntryId(entry.id) %}
    {% if drafts %}
        {% set entry = craft.entryRevisions.getDraftById(drafts[0].draftId) %}
    {% endif %}
{% endif %}


Boom!