OK, I found lots of ways to handle this. I will not go into the more advanced methods (until a later post) of detecting whether xbmc is playing video, audio, or nothing, and if playing video then check to see if it is paused.
In the meantime, here is a sneaky way to force a discrete pause / unpause.
I say unpause because it is not going to act as play, unless something is already playing, but is paused.
In XBMC all the buttons and execute-actions for play, pause, play/pause do the same thing, as you have noted, which is to toggle play and pause.
What is even more ridiculous is that we have a json method: player.setspeed, and if you use this to set the speed to 0 you would think it would always cause XBMC to pause. But alas, if XBMC is already paused, setting the speed to 0 will cause it to start playing again! This is, of course, ridiculous but I found a way around it.
Setting the play speed to 2 will always set it to 2, even if it is already at 2. So, in order to
Pause: set play speed to 2, then set it to 0
Play: set play speed to 2, then set it to 1
This does result in a slight playback "blip" if you are paused and you re-pause, but it seems to work OK. Alternatively you could try using a play speed of -1 instead of 2.
<?xml version="1.0" encoding="utf-16"?>
<commandGroup open="True" name="xbmc sneaky video pause unpause" enabled="True" prefix="" priority="0" requiredProcess="" description="">
<command id="1141" name="cheating video pause" enabled="true" alwaysOn="False" confirm="False" requiredConfidence="0" loop="False" loopDelay="0" loopMax="0" description="">
<action>
<cmdType>XJson.Raw</cmdType>
<cmdString>player.setspeed&&"playerid":1,"speed":2</cmdString>
<cmdRepeat>1</cmdRepeat>
</action>
<action>
<cmdType>XJson.Raw</cmdType>
<cmdString>player.setspeed&&"playerid":1,"speed":0</cmdString>
<cmdRepeat>1</cmdRepeat>
</action>
</command>
<command id="1147" name="cheating video unpause" enabled="true" alwaysOn="False" confirm="False" requiredConfidence="0" loop="False" loopDelay="0" loopMax="0" description="">
<action>
<cmdType>XJson.Raw</cmdType>
<cmdString>player.setspeed&&"playerid":1,"speed":2</cmdString>
<cmdRepeat>1</cmdRepeat>
</action>
<action>
<cmdType>XJson.Raw</cmdType>
<cmdString>player.setspeed&&"playerid":1,"speed":1</cmdString>
<cmdRepeat>1</cmdRepeat>
</action>
</command>
</commandGroup>