I got this one working - it's actually pretty good too 
Code below for anyone who wants to use it 
new Float:MaxRunSpeed[]={1.0,1.2,1.3,1.4,1.5};
new Float:BaseRunSpeed[MAXPLAYERS];
new Float:CurrentPos[MAXPLAYERS+1][3];
new bool:b_IsRunning[MAXPLAYERS];
public Action:OnPlayerRunCmd(client, &buttons, &impulse, Float:vel[3], Float:angles[3], &weapon)
{
if(IsPlayerAlive(client))
{
if(!b_IsRunning[client])
{
if(buttons & IN_FORWARD || buttons & IN_BACK || buttons & IN_LEFT || buttons & IN_RIGHT || buttons & IN_MOVELEFT || buttons & IN_MOVERIGHT || buttons & IN_RUN)
{
b_IsRunning[client]=true;
GetClientAbsOrigin(client, CurrentPos[client]);
CreateTimer(0.1,StartRun,client);
}
}
}
}
public Action:StartRun(Handle:timer, any:client)
{
new skill_run=War3_GetSkillLevel(client,thisRaceID,SKILL1);
if(skill_run>0)
{
new Float:newpos[3];
GetClientAbsOrigin(client, newpos);
if(newpos[0]!=CurrentPos[client][0] && newpos[1]!=CurrentPos[client][1])
{
CurrentPos[client]=newpos;
CreateTimer(0.1,StartRun,client);
if(BaseRunSpeed[client] < MaxRunSpeed[skill_run])
{
BaseRunSpeed[client] += 0.01;
War3_SetBuff(client,fMaxSpeed,thisRaceID,BaseRunSpeed[client]);
}
else
{
War3_SetBuff(client,fMaxSpeed,thisRaceID,MaxRunSpeed[skill_run]);
}
}
else
{
BaseRunSpeed[client] = 1.0;
b_IsRunning[client]=false;
War3_SetBuff(client,fMaxSpeed,thisRaceID,1.0);
}
}
}
I highly recommend to use a non timer function.
Change this:
public Action:StartRun(Handle:timer, any:client)
To this:
public StartRun(client) {
}
And instead of calling a timer, use StartRun(client);
Cause the OnPlayerRunCmd is happening on just about as fast as OnGameFrame() function which would create tons of timers, even though yours is set for 0.1
I'd hate to see all the code you do if you always use timers for function calls!