I would measure the with from kerb to kerb or end of the paved area if there is no kerb.
<a href="//wiki.openstreetmap.org/wiki/File:Width_at_6044_-_Meiringen_-_Kirchgasse.jpg"><img width="500 px" height="295 px" src="//wiki.openstreetmap.org/w/images/thumb/1/16/Width_at_6044_-_Meiringen_-_Kirchgasse.jpg/500px-Width_at_6044_-_Meiringen_-_Kirchgasse.jpg" alt="street with overlaid measurement arrows" /></a><br /><small>(own illustration based on a photo by Thisisbossi, license: CC [CC BY-SA 3.0)</small>
3.0](//creativecommons.org/licenses/by-sa/3.0/))</small>
That there is street parking possible can be indicated by a tag with the key [`parking:lane`](//wiki.openstreetmap.org/wiki/Key:parking:lane). That there is a shoulder can be indicated by a tag with the key [`shoulder`](//wiki.openstreetmap.org/wiki/Key:shoulder). All those are part of a street, are they not? … and users of the data could take those extra tags into account (e.g. when calculating if a over-width vehicle can use this street).
Definitely I would include the parking space if it is subtracted from what is a driving lane if no one parks there ... I am not that sure about the shoulder. If there is a `shoulder` tag on the highway way I would assume that the width includes the shoulder, as it is mapped as the same object which carries the width. A bit questionable what to think if there is no `shoulder` tag. And I think, we have no definition of what to include in the width of a "`highway`".
Some further thoughts:
Okay, so, what if a way with a `highway` tag and a `width` tag also has a [`sidewalk`](//wiki.openstreetmap.org/wiki/Key:sidewalk) tag? Since the `width` tag is tagged on the way it applies to the whole way – so, if the way inclused includes a `sidewalk=both` then `width` needs to include the sidewalk. Mindblowing... More specific width tags may make more sense, I guess. [`width:carriageway`](https://taginfo.openstreetmap.org/keys/?key=width:carriageway) (184 uses) maybe?
We have currently 2037 [`width:lanes`](https://taginfo.openstreetmap.org/keys/width%3Alanes) tags, which likely specify the width of the single [lanes](//wiki.openstreetmap.org/wiki/Lanes) (see the values at taginfo, too). Maybe specifying this makes more sense – depending on your use case.
Or tag the width of the shoulder in addition to the overall width: [`width:shoulder`](https://taginfo.openstreetmap.org/keys/width%3Ashoulder) (881 uses) or [`shoulder:width`](https://taginfo.openstreetmap.org/keys/shoulder%3Awidth) (1906 uses).
I assume, that in the beginning of OSM, when there were no `sidewalk`s, parking lanes, `shoulder`s and stuff tagged onto the same object on which the `highway` tag was on, the `width` just meant the width of the carriageway (possibly including such facultative parking like in the photo). While writing this answer I more or less came to the conclusion that, nowadays, a unspecified `width` tag does not make much sense for ways which have a highway tag, because it is not clear what is meant by it.