I figured it out. Not as hard as I initially thought! In case anyone is in the same boat, here's my solution.
Instead of using gestures like FreeDrag, we read the raw touch data. Windows Phone 8 hardware seems to support up to 8 simultaneous touch points.
So part of my code that detect location of any touch on screen.
public void GetTouchPoints()
{
TouchCollection touches = TouchPanel.GetState();
for (int i = 0; i < touches.Count; i++)
{
Vector2 position = touches[i].Position;
if (thumbstickMove.IsPointInside(position))
{
thumbstickMove.TouchLocation = position;
}
if (thumbstickFire.IsPointInside(position))
{
thumbstickFire.TouchLocation = position;
}
}
}