```python
from typing import Callable, Dict, Any

class JobQueue:
    def __init__(self):
        self.jobs: Dict[str, Dict[str, Any]] = {}

    def add_job(self, job_id: str, data: Dict[str, Any]) -> None:
        self.jobs[job_id] = {
            'data': data,
            'retry_count': 0,
            'backoff_delays': []
        }

    def process_job(self, job_id: str, processor: Callable) -> bool:
        if job_id not in self.jobs:
            raise ValueError(f"Job {job_id} not found")

        job = self.jobs[job_id]
        data = job['data']
        max_retries = 3
        retry_count = job['retry_count']

        while retry_count < max_retries:
            try:
                processor(data)
                # Reset retry count on success
                job['retry_count'] = 0
                return True
            except Exception:
                retry_count += 1
                job['retry_count'] = retry_count
                
                if retry_count >= max_retries:
                    return False
                
                # Calculate exponential backoff: 1s, 2s, 4s
                delay = 2 ** (retry_count - 1)
                job['backoff_delays'].append(delay)
                # Note: Actual time.sleep() is skipped as per requirements
                
        return False
```