What you are missing is a very important point:
An algorithm is never $O()$ of anything, since it is usually not a even a real-valued function.
When we say that bubble-sort is $O(n^2)$, what we mean is that in the function $f$, that represents the worst case run-time of bubble sort, is $O(n^2)$.
In this case, this function is indeed $\theta(n^2)$, since in the worst case, the run-time is bounded from below and from above by $c\cdot n^2$ for the relevant constants $c$.
To be more precise, the function that we refer to as the worst case runtime of an algorithm $A$ is defined by
$$f_A(n)=\max_{x: |x|=n}\{\text{runtime of $A$ on input x}\}$$
And it is this function that we analyze for the worst case run time.
The best case run-time can be analyzed as well, of course. As you suggest, the best case run time of bubble sort is not $\theta(n^2)$, but rather $\theta(n)$.