I don't think you can do this natively with Vim, but It looks like you could probably do this using AutoHotKey. I'm not an Autohotkey expert, but here's what I slapped together:
Taken from the example here:
This script uses Capslock key to give a hotkey 2 different outputs.
I'm not sure if you need to use +; instead of : in the second part to switch to command mode.
n=0
Capslock::
On := 1
If On=True {
Send i
On := False
} Else {
Send :
On := True
}
Return
The above script is untested, but should switch between sending i (for insert) or : (to insert command mode). Unfortunately this won't keep track of the current state VIM is in.
You'd have to learn my AHK scripting for that (how to use variables, so when in insert and you hit keys like '?', '/', 'esc', ':', etc it would know to variable used to store the VIM mode in AHK as well as send the real code).
References:
http://www.autohotkey.com/board/topic/68710-autohotkey-toggle-state-function/
http://www.autohotkey.com/docs/commands/SetNumScrollCapsLockState.htm
http://www.autohotkey.com/board/topic/42379-toggle-key/
For your second part it looks like it could be done with something like:
http://www.autohotkey.com/board/topic/51215-completely-disable-capslock/
http://www.autohotkey.com/board/topic/61-use-capslock-as-a-toggle/
http://www.autohotkey.com/board/topic/68710-autohotkey-toggle-state-function/
Not totally sure but you made to do the registry edit for VIM to recognize the Capslock change correctly:
http://www.autohotkey.com/docs/misc/Remap.htm#