If you look at it closely, there is a clear correlation between the _Alpha_ value and the appearance of the objects. It is not that they only show up semi-transparent when they are not 0 or 1, but there is a difference between 0 and 1 as well: when the _Alpha_ is 1, the objects are holdouts - i.e., their shape is "cut out" of the image and there is transparency behind them, no matter if you have set _Film_ > _Transparent_ or not, even if there is an HDRI in the background, the holdout objects are cut out and there is transparency. They do appear in reflections and throw shadows though.

But that is not what happens if the _Alpha_ is set 0. In this case, the objects are simply transparent, i.e. they are invisible in the scene and also do not appear in reflections or throw shadows or anything. However they do not cut out everything in their place.

The _Holdout_ setting for a collection is like adding a _Holdout_ shader node to all materials of the object. The _Alpha_ channel in the _Principled BSDF_ is like using a normal opaque shader and combining it with a _Transparent BSDF_ via _Mix Shader_ node, and the mix factor is the _Alpha_ value.

Now the _Alpha_ value effects the collection _Holdout_ in a way as if the objects had a material with a _Holdout_ nand a _Transparent_ node mixed together, and the _Alpha_ value controls how much the object is transparent or holdout.

As you might have noticed, setting _Alpha_ for example to 0.5, the object becomes semi-transparent - but instead of showing half transparency and half the _Principled BSDF_, it shows half holdout. So the _Holdout_ replaces the opaque part of the _Principled BSDF_.

Visual examples:
-

Let's say I have this scene. The three cubes are together in a collection, they all are  opaque with an _Alpha_ value of 1 in their _Principled BSDF_ and there is an HDRI in the background.

[![basic scene][1]][1]

Now I enable _Holdout_ for the collection of the cubes. Wherever they are in front of something, they mask out the image and show transparency. But they are still "visible" to the other objects in the scene, they are in the reflections and throw shadows.

[![normal holdout][2]][2]

If you now set all _Alpha_ values on the cubes to 0, this would be like when you mix them with a _Transparent BSDF_ and set the mix to 100% transparent. They are invisible to the camera and the scene objects, no reflections, no shadows. But also no masking. This is the same as if you had no _Holdout_ enabled - because the _Holdout_ simply spoken replaces the opaque part of the shader - since this is like 100% transparent, there is no opacity to be replaced with a holdout.

[![full transparency][3]][3]

If I now set the _Alpha_ to a value between 0 and 1 you can see, the cubes are partly transparent and show what is behind them (like normal transparency) and partly show a transparent background (like a normal holdout). Notice that the semi-transparent do not show their color (only in the reflections).

[![semi-transparent holdout][4]][4]

If the cubes would not be affected by the holdout and simply use their _Principled BSDF_ settings with partial transparency, it would look like that, the cubes showing their colors although being partly see-through.

[![normal transparency][5]][5]

Possible workaround
-

A slightly tedious workaround (depending on how many semi-transparent objects you have in the _Holdout_ collection) would be to mask those objects with a _Cryptomatte_ node in the _Compositor_. Let's re-use the example scene from before. This time, two cubes are opaque and therefore masked out completely like they are supposed to be, but the one on the right has an _Alpha_ value < 1 and is just partly masking the image:

[![partly masked cube][6]][6]

What you can do now is go to the _View Layer Properties_ tab and under _Passes_ enable _Cryptomatte_ > _Object_.

[![enable cryptomatte][7]][7]

This allows you to use a _Cryptomatte_ node - not _Cryptomatte (Legacy)_! - in the _Compositor_ like this: you need to have _Backdrop_ enabled and use a _Viewer_ node. With the rendered image in the background, click on the <kbd>+</kbd> button next to the _Matte ID_ field in the _Cryptomatte_ node. This enables an eyedropper tool with which you can click on the semi-transparent cube to select it. If you now plug the _Pick_ output into the _Viewer_ node, you can see that the selected cube is masked.

[![cube mask][8]][8]

Of course what you want for the alpha of the cube is the exact opposite, so you can use an _Invert Color_ node to invert the mask. If you now plug this mask and the _Alpha_ output of the _Render Layers_ node into a _Math_ node set to _Minimum_, the semi-transparent grey value of the original alpha will be replaced with the black from the inverted _Cryptomatte_. The result can be plugged into a _Set Alpha_ node and replace the original alpha channel.

[![set new alpha][9]][9]

The tedious part of this process is, the _Cryptomatte_ node does not work with collections, so if you have a lot of semi-transparent objects in the _Holdout_ collection, you have to select them all separately one by one. I should also mention, the _Cryptomatte_ node does not work with volumetric materials (neither does _Holdout_).


  [1]: https://i.sstatic.net/alBeG.jpg
  [2]: https://i.sstatic.net/8sQaL.jpg
  [3]: https://i.sstatic.net/ZR4ZN.jpg
  [4]: https://i.sstatic.net/pz1pJ.jpg
  [5]: https://i.sstatic.net/SijaB.jpg
  [6]: https://i.sstatic.net/LL5QV.jpg
  [7]: https://i.sstatic.net/OrH89.jpg
  [8]: https://i.sstatic.net/H9gku.jpg
  [9]: https://i.sstatic.net/OfeUF.jpg