How to refresh wired service getRecord manually?

To make refreshApex clear the client-side cache it is necessary to capture and store the entire result from the getRecord wire. In this case you cannot define your handler to accept an anonymous object with data and error properties.

You need to do something like the following. First add a private property to hold the result:

_getRecordResponse;

Then update the handling of the getRecord wire response from something like:

@wire(getRecord, {...})
receiveRecord({error, data}) {
    ...
}

to:

@wire(getRecord, {...})
receiveRecord(response) {
    this._getRecordResponse = response;
    let error = response && response.error;
    let data = response && response.data;
    ...
}

Now that you have the _getRecordResponse, you can force the record to be reloaded by calling:

refreshApex(this._getRecordResponse);

Extending answer from @Phil W,

For below Sample LWC Js:

@api recordId = '00128000009j45tAAA';
@track wiredAccount;

fields = [ACCOUNT_NAME_FIELD, ACCOUNT_DESCRIPTION_FIELD];

@wire(getRecord, { recordId: '$recordId', fields: '$fields' })
fetchAcc(response) {
    console.log('Account => ', JSON.stringify(response));
    this.wiredAccount = response;
}

refreshWire() {
    refreshApex(this.wiredAccount);
}

Although we invoke refreshWire, the wired method fetchAcc will be invoked ONLY if new record and UI record in this.wiredAccount are not same and consecutively see the console log. If the new record is same as UI record this.wiredAccount, the method fetchAcc will not be invoked (even after 30 seconds) and we will not see any console log. Finally, refreshApex should have been named refreshWire as it not just updates apex method response but also wired service response.