In the meantime I came up with the following approach:
noremap <script> <unique> <SID><\O> <Nop>
inoremap <script> <unique> <SID><\O> <C-\><C-O><SID><\O>
cnoremap <script> <unique> <SID><\O> <C-\><C-N><SID><\O>
noremap <script> <unique> <SID><\N> <Nop>
noremap! <script> <unique> <SID><\N> <C-\><C-N><SID><\N>
For each Vim mode the <SID><\O> key sequence is mapped in order to appropriately escape (e.g. <C-\><C-O>) from Vim's current mode (e.g. insert-mode) to its normal mode. The right hand side of each mapping ends in its left hand side (e.g. <SID><\O>) in order to recursively try to escape again. The script-local (<script>, <SID>) recursion stops as soon the last escape key sequence reaches Vim's normal mode in which the <SID><\O> key sequence is mapped to nothing (<Nop>).
Likewise the <SID><\N> key sequence is mapped to not only escape once (<SID><\O>) from e.g. insert-mode before returning back but permanently stay in normal-mode.
With the help of the above definitions I mapped the <F1> and <S-F1> function keys as follows:
noremap <script> <unique> <expr> <F1> <SID>ToggleHelp(':<C-U>help', '<SID>')
noremap! <script> <unique> <expr> <F1> <SID>ToggleHelp(':<C-U>help', '<SID>')
noremap <script> <unique> <expr> <S-F1> <SID>ToggleHelp(':<C-U>helpgrep', '<SID>')
noremap! <script> <unique> <expr> <S-F1> <SID>ToggleHelp(':<C-U>helpgrep', '<SID>')
function! s:ToggleHelp(cmd, sid)
ToggleVar s:HelpCwordOn
let a=s:HelpCwordOn ? '<cword>' : '<cWORD>'
return a:sid . '<\O>' . a:cmd . ' ' . expand(a) . ' '
endfunction
command! -bang -nargs=+ ToggleVar call <SID>ToggleVar(<bang>0, <f-args>)
function! s:ToggleVar(bang, var)
let {a:var}=exists(a:var) ? !{a:var} : !a:bang
endfunction
Instead of having the <F1> key simply open Vim's help in a new window, it starts the :help command with the inner word (<cword>) under the cursor. By consecutively pressing the <F1> key, one switches to the outer word (<cWORD>) and toggels back again.
The 4 mappings from the use case above could also be defined as follows in order to not repeat yourself; i.e. keeping it "dry":
let a='noremap'
let b='<script> <unique> <expr>'
let c='<F1>'
let d='<S-F1>'
let e='<SID>ToggleHelp('':<C-U>help'
let f='grep'
let g=''', ''<SID>'')'
let h=b . ' ' . c . ' ' . e . g
let i=b . ' ' . d . ' ' . e . f . g
exec a . ' ' . h
exec a . '! ' . h
exec a . ' ' . i
exec a . '! ' . i